@jakubmazanec/args 2.0.4 → 2.0.5-unstable.91147a2

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,2 +1,2 @@
1
1
  /** Short option name. */
2
- export type ShortOptionName = 'A' | 'a' | 'B' | 'b' | 'C' | 'c' | 'D' | 'd' | 'E' | 'e' | 'F' | 'f' | 'G' | 'g' | 'H' | 'h' | 'I' | 'i' | 'J' | 'j' | 'K' | 'k' | 'L' | 'l' | 'M' | 'm' | 'N' | 'n' | 'O' | 'o' | 'P' | 'p' | 'Q' | 'q' | 'R' | 'r' | 'S' | 's' | 'T' | 't' | 'U' | 'u' | 'V' | 'v' | 'W' | 'w' | 'X' | 'x' | 'Y' | 'y' | 'Z' | 'z';
2
+ export type ShortOptionName = 'a' | 'A' | 'b' | 'B' | 'c' | 'C' | 'd' | 'D' | 'e' | 'E' | 'f' | 'F' | 'g' | 'G' | 'h' | 'H' | 'i' | 'I' | 'j' | 'J' | 'k' | 'K' | 'l' | 'L' | 'm' | 'M' | 'n' | 'N' | 'o' | 'O' | 'p' | 'P' | 'q' | 'Q' | 'r' | 'R' | 's' | 'S' | 't' | 'T' | 'u' | 'U' | 'v' | 'V' | 'w' | 'W' | 'x' | 'X' | 'y' | 'Y' | 'z' | 'Z';
@@ -6,10 +6,10 @@ import { type ParametersConfig } from '../ParametersConfig.js';
6
6
  */
7
7
  export declare class Checker {
8
8
  errors: Error[];
9
- checkCommandsConfig(commandsConfig: CommandsConfig | []): void;
10
- checkParametersConfig(parametersConfig: ParametersConfig | []): void;
9
+ checkCommandsConfig(commandsConfig: [] | CommandsConfig): void;
10
+ checkParametersConfig(parametersConfig: [] | ParametersConfig): void;
11
11
  checkOptionsConfig(optionsConfig: OptionsConfig): void;
12
- checkParsedParameters(parametersConfig: ParametersConfig | [], parsedParameters: unknown[]): void;
12
+ checkParsedParameters(parametersConfig: [] | ParametersConfig, parsedParameters: unknown[]): void;
13
13
  checkParsedOptions(optionsConfig: OptionsConfig, parsedOptions: Record<string, unknown>): void;
14
14
  addError(error: Error): void;
15
15
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/Checker.ts"],
4
- "sourcesContent": ["import {type CommandsConfig} from '../CommandsConfig.js';\nimport {type OptionsConfig} from '../OptionsConfig.js';\nimport {type ParametersConfig} from '../ParametersConfig.js';\nimport {ValidationError} from '../ValidationError.js';\nimport {isCommand} from './isCommand.js';\nimport {isLongOption} from './isLongOption.js';\n\n/**\n * `Checker` is used for handling various checks before, during, and after parsing of the arguments.\n */\nexport class Checker {\n errors: Error[] = [];\n\n checkCommandsConfig(commandsConfig: CommandsConfig | []) {\n for (let commandConfig of commandsConfig) {\n if (!isCommand(commandConfig)) {\n this.addError(new ValidationError('INVALID_COMMAND', {messageParameters: [commandConfig]}));\n }\n }\n }\n\n checkParametersConfig(parametersConfig: ParametersConfig | []) {\n for (let [i, parameterConfig] of parametersConfig.entries()) {\n // types of choices must be correct\n if (\n parameterConfig.type !== 'boolean' &&\n parameterConfig.choices && // default values and chocies do not contradict each other\n parameterConfig.defaultValue !== undefined &&\n !parameterConfig.choices.includes(parameterConfig.defaultValue as never)\n ) {\n this.addError(\n new ValidationError('INVALID_PARAMETER_DEFAULT_AND_CHOICES', {\n messageParameters: [parameterConfig.label ?? i, parameterConfig.defaultValue],\n }),\n );\n }\n\n // if parameter is required, all parameters before must be required too\n if (\n i >= 1 &&\n parameterConfig.required === true &&\n !parametersConfig\n .slice(0, i)\n .every(\n (previousParameterConfig) =>\n previousParameterConfig.required === true ||\n previousParameterConfig.defaultValue !== undefined,\n )\n ) {\n this.addError(\n new ValidationError('INVALID_PARAMETER_ORDER', {\n messageParameters: [parameterConfig.label ?? i],\n }),\n );\n }\n }\n }\n\n checkOptionsConfig(optionsConfig: OptionsConfig) {\n let usedShortOptionNames: Set<string> = new Set([]);\n\n for (let [optionName, optionConfig] of Object.entries(optionsConfig)) {\n // option names must be in correct format\n if (!isLongOption(`--${optionName}`)) {\n this.addError(\n new ValidationError('INVALID_OPTION_NAME', {\n messageParameters: [optionName],\n }),\n );\n }\n\n // option short names must be unique\n if (optionConfig.shortName && usedShortOptionNames.has(optionConfig.shortName)) {\n this.addError(\n new ValidationError('REPEATED_OPTION_NAME', {\n messageParameters: [optionName, optionConfig.shortName],\n }),\n );\n } else if (optionConfig.shortName) {\n usedShortOptionNames.add(optionConfig.shortName);\n }\n\n // default values and chocies do not contradict each other\n if (\n (optionConfig.type === 'string' ||\n (optionConfig.type === 'number' && !optionConfig.count)) &&\n optionConfig.choices &&\n optionConfig.defaultValue !== undefined &&\n !optionConfig.choices.includes(optionConfig.defaultValue as never)\n ) {\n this.addError(\n new ValidationError('INVALID_OPTION_DEFAULT_AND_CHOICES', {\n messageParameters: [optionName, optionConfig.defaultValue],\n }),\n );\n }\n }\n }\n\n checkParsedParameters(parametersConfig: ParametersConfig | [], parsedParameters: unknown[]) {\n for (let [i, parameterConfig] of parametersConfig.entries()) {\n let parsedParameter = parsedParameters[i];\n\n // required parameters must have value\n if (parameterConfig.required === true && parsedParameter === undefined) {\n this.addError(\n new ValidationError('MISSING_PARAMETER', {\n messageParameters: [parameterConfig.label ?? i],\n }),\n );\n }\n }\n }\n\n checkParsedOptions(optionsConfig: OptionsConfig, parsedOptions: Record<string, unknown>) {\n for (let [optionName, optionConfig] of Object.entries(optionsConfig)) {\n let parsedOption = parsedOptions[optionName];\n\n // check required\n if (optionConfig.required && parsedOption === undefined) {\n this.addError(\n new ValidationError('MISSING_OPTION', {\n messageParameters: [optionName],\n }),\n );\n }\n\n // check arity\n if (\n parsedOption !== undefined &&\n ((optionConfig.type === 'string' && optionConfig.multiple) ||\n (optionConfig.type === 'number' && optionConfig.multiple)) &&\n typeof optionConfig.arity === 'number' &&\n Array.isArray(parsedOption) &&\n (parsedOption as unknown[]).length > 0 &&\n (parsedOption as unknown[]).length !== optionConfig.arity\n ) {\n this.addError(\n new ValidationError('INVALID_OPTION_ARITY', {\n messageParameters: [optionName, (parsedOption as unknown[]).length, optionConfig.arity],\n }),\n );\n }\n }\n }\n\n addError(error: Error) {\n this.errors.push(error);\n }\n}\n"],
4
+ "sourcesContent": ["import {type CommandsConfig} from '../CommandsConfig.js';\nimport {type OptionsConfig} from '../OptionsConfig.js';\nimport {type ParametersConfig} from '../ParametersConfig.js';\nimport {ValidationError} from '../ValidationError.js';\nimport {isCommand} from './isCommand.js';\nimport {isLongOption} from './isLongOption.js';\n\n/**\n * `Checker` is used for handling various checks before, during, and after parsing of the arguments.\n */\nexport class Checker {\n errors: Error[] = [];\n\n checkCommandsConfig(commandsConfig: [] | CommandsConfig) {\n for (let commandConfig of commandsConfig) {\n if (!isCommand(commandConfig)) {\n this.addError(new ValidationError('INVALID_COMMAND', {messageParameters: [commandConfig]}));\n }\n }\n }\n\n checkParametersConfig(parametersConfig: [] | ParametersConfig) {\n for (let [i, parameterConfig] of parametersConfig.entries()) {\n // types of choices must be correct\n if (\n parameterConfig.type !== 'boolean' &&\n parameterConfig.choices && // default values and chocies do not contradict each other\n parameterConfig.defaultValue !== undefined &&\n !parameterConfig.choices.includes(parameterConfig.defaultValue as never)\n ) {\n this.addError(\n new ValidationError('INVALID_PARAMETER_DEFAULT_AND_CHOICES', {\n messageParameters: [parameterConfig.label ?? i, parameterConfig.defaultValue],\n }),\n );\n }\n\n // if parameter is required, all parameters before must be required too\n if (\n i >= 1 &&\n parameterConfig.required === true &&\n !parametersConfig\n .slice(0, i)\n .every(\n (previousParameterConfig) =>\n previousParameterConfig.required === true ||\n previousParameterConfig.defaultValue !== undefined,\n )\n ) {\n this.addError(\n new ValidationError('INVALID_PARAMETER_ORDER', {\n messageParameters: [parameterConfig.label ?? i],\n }),\n );\n }\n }\n }\n\n checkOptionsConfig(optionsConfig: OptionsConfig) {\n let usedShortOptionNames: Set<string> = new Set([]);\n\n for (let [optionName, optionConfig] of Object.entries(optionsConfig)) {\n // option names must be in correct format\n if (!isLongOption(`--${optionName}`)) {\n this.addError(\n new ValidationError('INVALID_OPTION_NAME', {\n messageParameters: [optionName],\n }),\n );\n }\n\n // option short names must be unique\n if (optionConfig.shortName && usedShortOptionNames.has(optionConfig.shortName)) {\n this.addError(\n new ValidationError('REPEATED_OPTION_NAME', {\n messageParameters: [optionName, optionConfig.shortName],\n }),\n );\n } else if (optionConfig.shortName) {\n usedShortOptionNames.add(optionConfig.shortName);\n }\n\n // default values and chocies do not contradict each other\n if (\n (optionConfig.type === 'string' ||\n (optionConfig.type === 'number' && !optionConfig.count)) &&\n optionConfig.choices &&\n optionConfig.defaultValue !== undefined &&\n !optionConfig.choices.includes(optionConfig.defaultValue as never)\n ) {\n this.addError(\n new ValidationError('INVALID_OPTION_DEFAULT_AND_CHOICES', {\n messageParameters: [optionName, optionConfig.defaultValue],\n }),\n );\n }\n }\n }\n\n checkParsedParameters(parametersConfig: [] | ParametersConfig, parsedParameters: unknown[]) {\n for (let [i, parameterConfig] of parametersConfig.entries()) {\n let parsedParameter = parsedParameters[i];\n\n // required parameters must have value\n if (parameterConfig.required === true && parsedParameter === undefined) {\n this.addError(\n new ValidationError('MISSING_PARAMETER', {\n messageParameters: [parameterConfig.label ?? i],\n }),\n );\n }\n }\n }\n\n checkParsedOptions(optionsConfig: OptionsConfig, parsedOptions: Record<string, unknown>) {\n for (let [optionName, optionConfig] of Object.entries(optionsConfig)) {\n let parsedOption = parsedOptions[optionName];\n\n // check required\n if (optionConfig.required && parsedOption === undefined) {\n this.addError(\n new ValidationError('MISSING_OPTION', {\n messageParameters: [optionName],\n }),\n );\n }\n\n // check arity\n if (\n parsedOption !== undefined &&\n ((optionConfig.type === 'string' && optionConfig.multiple) ||\n (optionConfig.type === 'number' && optionConfig.multiple)) &&\n typeof optionConfig.arity === 'number' &&\n Array.isArray(parsedOption) &&\n (parsedOption as unknown[]).length > 0 &&\n (parsedOption as unknown[]).length !== optionConfig.arity\n ) {\n this.addError(\n new ValidationError('INVALID_OPTION_ARITY', {\n messageParameters: [optionName, (parsedOption as unknown[]).length, optionConfig.arity],\n }),\n );\n }\n }\n }\n\n addError(error: Error) {\n this.errors.push(error);\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,7 @@ import { type OptionsConfig } from '../OptionsConfig.js';
6
6
  export declare class OptionScope {
7
7
  name: string;
8
8
  values: unknown[];
9
- previousParsedValue?: unknown[] | unknown;
9
+ previousParsedValue?: unknown | unknown[];
10
10
  readonly config: OptionConfig;
11
11
  constructor(optionName: string, optionsConfig: OptionsConfig, allowUnknownOptions?: boolean);
12
12
  captureArg(arg: string): void;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/OptionScope.ts"],
4
- "sourcesContent": ["import camelCase from 'lodash.camelcase';\n\nimport {type OptionConfig} from '../OptionConfig.js';\nimport {type OptionsConfig} from '../OptionsConfig.js';\nimport {ParsingError} from '../ParsingError.js';\nimport {castValue} from './castValue.js';\n\n/**\n * `CommandScope` handles storing information about parsing of an option..\n */\nexport class OptionScope {\n name: string;\n\n values: unknown[] = [];\n previousParsedValue?: unknown[] | unknown;\n readonly config: OptionConfig;\n\n constructor(optionName: string, optionsConfig: OptionsConfig, allowUnknownOptions = false) {\n this.name = optionName;\n\n // Convert option to camel case\n if (this.name.includes('-')) {\n this.name = camelCase(this.name);\n }\n\n let optionConfig = optionsConfig[this.name];\n\n if (!optionConfig) {\n if (!allowUnknownOptions) {\n throw new ParsingError('UNKNOWN_OPTION', {messageParameters: [this.name]});\n }\n\n optionConfig = {\n type: 'string',\n };\n }\n\n this.config = optionConfig;\n }\n\n captureArg(arg: string) {\n let value = castValue(arg, this.config.type);\n\n if (\n ((this.config.type === 'number' && !this.config.count) || this.config.type === 'string') &&\n this.config.choices !== undefined &&\n !this.config.choices.includes(value as never)\n ) {\n throw new ParsingError('INVALID_OPTION', {\n messageParameters: [\n value,\n this.name,\n this.config.choices.map((choice) => `\"${choice}\"`).join(', '),\n ],\n });\n }\n\n if (this.config.multiple) {\n this.values.push(value);\n } else {\n this.values = [value];\n }\n }\n\n isComplete() {\n if (!this.config.multiple && this.values.length === 1) {\n return true;\n }\n\n if (\n this.config.multiple &&\n typeof this.config.arity === 'number' &&\n this.values.length + ((this.previousParsedValue as unknown[] | undefined) ?? []).length ===\n this.config.arity\n ) {\n return true;\n }\n\n return false;\n }\n\n getValue() {\n let {config, previousParsedValue} = this;\n let {values} = this;\n\n if (config.type === 'boolean' && !config.multiple && !values.length) {\n values = [true];\n } else if (config.type === 'number' && config.count && !values.length) {\n values = [1];\n }\n\n if (config.multiple && previousParsedValue) {\n values = [...(previousParsedValue as unknown[]), ...values];\n }\n\n if (config.type === 'number' && config.count && previousParsedValue) {\n values = [(values[0] as number) + (previousParsedValue as number)];\n }\n\n return config.multiple ? values : values[0];\n }\n}\n"],
4
+ "sourcesContent": ["import camelCase from 'lodash.camelcase';\n\nimport {type OptionConfig} from '../OptionConfig.js';\nimport {type OptionsConfig} from '../OptionsConfig.js';\nimport {ParsingError} from '../ParsingError.js';\nimport {castValue} from './castValue.js';\n\n/**\n * `CommandScope` handles storing information about parsing of an option..\n */\nexport class OptionScope {\n name: string;\n\n values: unknown[] = [];\n previousParsedValue?: unknown | unknown[];\n readonly config: OptionConfig;\n\n constructor(optionName: string, optionsConfig: OptionsConfig, allowUnknownOptions = false) {\n this.name = optionName;\n\n // Convert option to camel case\n if (this.name.includes('-')) {\n this.name = camelCase(this.name);\n }\n\n let optionConfig = optionsConfig[this.name];\n\n if (!optionConfig) {\n if (!allowUnknownOptions) {\n throw new ParsingError('UNKNOWN_OPTION', {messageParameters: [this.name]});\n }\n\n optionConfig = {\n type: 'string',\n };\n }\n\n this.config = optionConfig;\n }\n\n captureArg(arg: string) {\n let value = castValue(arg, this.config.type);\n\n if (\n ((this.config.type === 'number' && !this.config.count) || this.config.type === 'string') &&\n this.config.choices !== undefined &&\n !this.config.choices.includes(value as never)\n ) {\n throw new ParsingError('INVALID_OPTION', {\n messageParameters: [\n value,\n this.name,\n this.config.choices.map((choice) => `\"${choice}\"`).join(', '),\n ],\n });\n }\n\n if (this.config.multiple) {\n this.values.push(value);\n } else {\n this.values = [value];\n }\n }\n\n isComplete() {\n if (!this.config.multiple && this.values.length === 1) {\n return true;\n }\n\n if (\n this.config.multiple &&\n typeof this.config.arity === 'number' &&\n this.values.length + ((this.previousParsedValue as undefined | unknown[]) ?? []).length ===\n this.config.arity\n ) {\n return true;\n }\n\n return false;\n }\n\n getValue() {\n let {config, previousParsedValue} = this;\n let {values} = this;\n\n if (config.type === 'boolean' && !config.multiple && !values.length) {\n values = [true];\n } else if (config.type === 'number' && config.count && !values.length) {\n values = [1];\n }\n\n if (config.multiple && previousParsedValue) {\n values = [...(previousParsedValue as unknown[]), ...values];\n }\n\n if (config.type === 'number' && config.count && previousParsedValue) {\n values = [(values[0] as number) + (previousParsedValue as number)];\n }\n\n return config.multiple ? values : values[0];\n }\n}\n"],
5
5
  "mappings": ";AAAA,OAAO,eAAe;AAItB,SAAQ,oBAAmB;AAC3B,SAAQ,iBAAgB;AAKjB,aAAM,YAAY;AAAA,EACvB;AAAA,EAEA,SAAoB,CAAC;AAAA,EACrB;AAAA,EACS;AAAA,EAET,YAAY,YAAoB,eAA8B,sBAAsB,OAAO;AACzF,SAAK,OAAO;AAGZ,QAAI,KAAK,KAAK,SAAS,GAAG,GAAG;AAC3B,WAAK,OAAO,UAAU,KAAK,IAAI;AAAA,IACjC;AAEA,QAAI,eAAe,cAAc,KAAK,IAAI;AAE1C,QAAI,CAAC,cAAc;AACjB,UAAI,CAAC,qBAAqB;AACxB,cAAM,IAAI,aAAa,kBAAkB,EAAC,mBAAmB,CAAC,KAAK,IAAI,EAAC,CAAC;AAAA,MAC3E;AAEA,qBAAe;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AAEA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW,KAAa;AACtB,QAAI,QAAQ,UAAU,KAAK,KAAK,OAAO,IAAI;AAE3C,SACI,KAAK,OAAO,SAAS,YAAY,CAAC,KAAK,OAAO,SAAU,KAAK,OAAO,SAAS,aAC/E,KAAK,OAAO,YAAY,UACxB,CAAC,KAAK,OAAO,QAAQ,SAAS,KAAc,GAC5C;AACA,YAAM,IAAI,aAAa,kBAAkB;AAAA,QACvC,mBAAmB;AAAA,UACjB;AAAA,UACA,KAAK;AAAA,UACL,KAAK,OAAO,QAAQ,IAAI,CAAC,WAAW,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,OAAO,UAAU;AACxB,WAAK,OAAO,KAAK,KAAK;AAAA,IACxB,OAAO;AACL,WAAK,SAAS,CAAC,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,aAAa;AACX,QAAI,CAAC,KAAK,OAAO,YAAY,KAAK,OAAO,WAAW,GAAG;AACrD,aAAO;AAAA,IACT;AAEA,QACE,KAAK,OAAO,YACZ,OAAO,KAAK,OAAO,UAAU,YAC7B,KAAK,OAAO,UAAW,KAAK,uBAAiD,CAAC,GAAG,WAC/E,KAAK,OAAO,OACd;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW;AACT,QAAI,EAAC,QAAQ,oBAAmB,IAAI;AACpC,QAAI,EAAC,OAAM,IAAI;AAEf,QAAI,OAAO,SAAS,aAAa,CAAC,OAAO,YAAY,CAAC,OAAO,QAAQ;AACnE,eAAS,CAAC,IAAI;AAAA,IAChB,WAAW,OAAO,SAAS,YAAY,OAAO,SAAS,CAAC,OAAO,QAAQ;AACrE,eAAS,CAAC,CAAC;AAAA,IACb;AAEA,QAAI,OAAO,YAAY,qBAAqB;AAC1C,eAAS,CAAC,GAAI,qBAAmC,GAAG,MAAM;AAAA,IAC5D;AAEA,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,qBAAqB;AACnE,eAAS,CAAE,OAAO,CAAC,IAAgB,mBAA8B;AAAA,IACnE;AAEA,WAAO,OAAO,WAAW,SAAS,OAAO,CAAC;AAAA,EAC5C;AACF;",
6
6
  "names": []
7
7
  }
@@ -4,4 +4,4 @@
4
4
  * @param value The value to be converted.
5
5
  * @param type The type to convert the value into.
6
6
  * */
7
- export declare function castValue<T extends 'boolean' | 'number' | 'string'>(value: string, type?: T): T extends 'boolean' ? boolean : T extends 'number' ? number : string;
7
+ export declare function castValue<T extends 'boolean' | 'number' | 'string'>(value: string, targetType?: T): T extends 'boolean' ? boolean : T extends 'number' ? number : string;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  import { isFalseString } from "./isFalseString.js";
3
- export function castValue(value, type) {
4
- switch (type) {
3
+ export function castValue(value, targetType) {
4
+ switch (targetType) {
5
5
  case "boolean": {
6
6
  let booleanString = String(value).toLowerCase();
7
7
  return !(isFalseString(booleanString) || booleanString === "");
@@ -9,7 +9,14 @@ export function castValue(value, type) {
9
9
  case "number": {
10
10
  return Number.parseFloat(value);
11
11
  }
12
+ case "string": {
13
+ return String(value);
14
+ }
15
+ case void 0: {
16
+ return String(value);
17
+ }
12
18
  default: {
19
+ targetType;
13
20
  return String(value);
14
21
  }
15
22
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../source/internals/castValue.ts"],
4
- "sourcesContent": ["import {isFalseString} from './isFalseString.js';\n\n/**\n * A function that casts string value to a specified type.\n *\n * @param value The value to be converted.\n * @param type The type to convert the value into.\n * */\nexport function castValue<T extends 'boolean' | 'number' | 'string'>(\n value: string,\n type?: T,\n): T extends 'boolean' ? boolean\n: T extends 'number' ? number\n: string {\n switch (type) {\n case 'boolean': {\n let booleanString = String(value).toLowerCase();\n\n return !(isFalseString(booleanString) || booleanString === '') as T extends 'boolean' ?\n boolean\n : T extends 'number' ? number\n : string;\n }\n\n case 'number': {\n return Number.parseFloat(value) as T extends 'boolean' ? boolean\n : T extends 'number' ? number\n : string;\n }\n\n default: {\n return String(value) as T extends 'boolean' ? boolean\n : T extends 'number' ? number\n : string;\n }\n }\n}\n"],
5
- "mappings": ";AAAA,SAAQ,qBAAoB;AAQrB,gBAAS,UACd,OACA,MAGO;AACP,UAAQ,MAAM;AAAA,IACZ,KAAK,WAAW;AACd,UAAI,gBAAgB,OAAO,KAAK,EAAE,YAAY;AAE9C,aAAO,EAAE,cAAc,aAAa,KAAK,kBAAkB;AAAA,IAI7D;AAAA,IAEA,KAAK,UAAU;AACb,aAAO,OAAO,WAAW,KAAK;AAAA,IAGhC;AAAA,IAEA,SAAS;AACP,aAAO,OAAO,KAAK;AAAA,IAGrB;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import {isFalseString} from './isFalseString.js';\n\n/**\n * A function that casts string value to a specified type.\n *\n * @param value The value to be converted.\n * @param type The type to convert the value into.\n * */\nexport function castValue<T extends 'boolean' | 'number' | 'string'>(\n value: string,\n targetType?: T,\n): T extends 'boolean' ? boolean\n: T extends 'number' ? number\n: string {\n switch (targetType) {\n case 'boolean': {\n let booleanString = String(value).toLowerCase();\n\n return !(isFalseString(booleanString) || booleanString === '') as T extends 'boolean' ?\n boolean\n : T extends 'number' ? number\n : string;\n }\n\n case 'number': {\n return Number.parseFloat(value) as T extends 'boolean' ? boolean\n : T extends 'number' ? number\n : string;\n }\n\n case 'string': {\n return String(value) as T extends 'boolean' ? boolean\n : T extends 'number' ? number\n : string;\n }\n\n case undefined: {\n return String(value) as T extends 'boolean' ? boolean\n : T extends 'number' ? number\n : string;\n }\n\n default: {\n targetType satisfies never;\n\n return String(value) as T extends 'boolean' ? boolean\n : T extends 'number' ? number\n : string;\n }\n }\n}\n"],
5
+ "mappings": ";AAAA,SAAQ,qBAAoB;AAQrB,gBAAS,UACd,OACA,YAGO;AACP,UAAQ,YAAY;AAAA,IAClB,KAAK,WAAW;AACd,UAAI,gBAAgB,OAAO,KAAK,EAAE,YAAY;AAE9C,aAAO,EAAE,cAAc,aAAa,KAAK,kBAAkB;AAAA,IAI7D;AAAA,IAEA,KAAK,UAAU;AACb,aAAO,OAAO,WAAW,KAAK;AAAA,IAGhC;AAAA,IAEA,KAAK,UAAU;AACb,aAAO,OAAO,KAAK;AAAA,IAGrB;AAAA,IAEA,KAAK,QAAW;AACd,aAAO,OAAO,KAAK;AAAA,IAGrB;AAAA,IAEA,SAAS;AACP;AAEA,aAAO,OAAO,KAAK;AAAA,IAGrB;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -11,6 +11,6 @@ export * from './internals/isOptionLike.js';
11
11
  export * from './internals/isShortOption.js';
12
12
  export * from './internals/isShortOptionsGroup.js';
13
13
  export * from './internals/isTrueString.js';
14
- export * from './internals/NormalizedCommandConfig.js';
15
- export * from './internals/NormalizedCommandsConfig.js';
14
+ export type * from './internals/NormalizedCommandConfig.js';
15
+ export type * from './internals/NormalizedCommandsConfig.js';
16
16
  export * from './internals/OptionScope.js';
@@ -12,7 +12,5 @@ export * from "./internals/isOptionLike.js";
12
12
  export * from "./internals/isShortOption.js";
13
13
  export * from "./internals/isShortOptionsGroup.js";
14
14
  export * from "./internals/isTrueString.js";
15
- export * from "./internals/NormalizedCommandConfig.js";
16
- export * from "./internals/NormalizedCommandsConfig.js";
17
15
  export * from "./internals/OptionScope.js";
18
16
  //# sourceMappingURL=internals.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../source/internals.ts"],
4
- "sourcesContent": ["export * from './internals/castValue.js';\nexport * from './internals/Checker.js';\nexport * from './internals/CommandScope.js';\nexport * from './internals/commandToArguments.js';\nexport * from './internals/createOptionShortNameMap.js';\nexport * from './internals/expandArguments.js';\nexport * from './internals/isCommand.js';\nexport * from './internals/isFalseString.js';\nexport * from './internals/isLongOption.js';\nexport * from './internals/isOptionLike.js';\nexport * from './internals/isShortOption.js';\nexport * from './internals/isShortOptionsGroup.js';\nexport * from './internals/isTrueString.js';\nexport * from './internals/NormalizedCommandConfig.js';\nexport * from './internals/NormalizedCommandsConfig.js';\nexport * from './internals/OptionScope.js';\n"],
5
- "mappings": ";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "sourcesContent": ["export * from './internals/castValue.js';\nexport * from './internals/Checker.js';\nexport * from './internals/CommandScope.js';\nexport * from './internals/commandToArguments.js';\nexport * from './internals/createOptionShortNameMap.js';\nexport * from './internals/expandArguments.js';\nexport * from './internals/isCommand.js';\nexport * from './internals/isFalseString.js';\nexport * from './internals/isLongOption.js';\nexport * from './internals/isOptionLike.js';\nexport * from './internals/isShortOption.js';\nexport * from './internals/isShortOptionsGroup.js';\nexport * from './internals/isTrueString.js';\nexport type * from './internals/NormalizedCommandConfig.js';\nexport type * from './internals/NormalizedCommandsConfig.js';\nexport * from './internals/OptionScope.js';\n"],
5
+ "mappings": ";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;",
6
6
  "names": []
7
7
  }
@@ -69,9 +69,8 @@ export function parseArguments(argv, parserConfig) {
69
69
  );
70
70
  }
71
71
  }
72
+ commandScope = null;
72
73
  }
73
- optionScope = null;
74
- commandScope = null;
75
74
  let optionName = arg;
76
75
  let optionValue;
77
76
  if (optionName.includes("=")) {
@@ -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\n/* eslint-disable no-param-reassign -- we need to add properties to the `parsedOption` object */\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/* eslint-enable no-param-reassign */\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 */\n// TODO: refactor\n// eslint-disable-next-line complexity -- TODO\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\n optionScope = null;\n commandScope = null;\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 &&\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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",
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\n/* eslint-disable no-param-reassign -- we need to add properties to the `parsedOption` object */\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/* eslint-enable no-param-reassign */\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: null | OptionScope = 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 &&\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.4",
3
+ "version": "2.0.5-unstable.91147a2",
4
4
  "description": "TypeScript-first library for parsing command line arguments.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,12 +27,12 @@
27
27
  "typecheck": "tsc --project tsconfig.typecheck.json"
28
28
  },
29
29
  "dependencies": {
30
- "@jakubmazanec/error": "^3.0.0",
31
- "@jakubmazanec/ts-utils": "^3.0.0",
30
+ "@jakubmazanec/error": "3.0.5-unstable.91147a2",
31
+ "@jakubmazanec/ts-utils": "3.0.5-unstable.91147a2",
32
32
  "lodash.camelcase": "^4.3.0"
33
33
  },
34
34
  "devDependencies": {
35
- "@jakubmazanec/eslint-config": "^3.2.0",
35
+ "@jakubmazanec/eslint-config": "4.0.0-unstable.91147a2",
36
36
  "@types/lodash": "^4.17.13",
37
37
  "@types/lodash.camelcase": "^4.3.9",
38
38
  "@types/node": "^22.9.0",
@@ -40,7 +40,7 @@
40
40
  "concurrently": "^9.1.0",
41
41
  "del-cli": "^6.0.0",
42
42
  "esbuild": "^0.24.0",
43
- "eslint": "^8.56.0",
43
+ "eslint": "^9.14.0",
44
44
  "lodash": "^4.17.21",
45
45
  "prettier": "^3.3.3",
46
46
  "prettier-plugin-packagejson": "^2.5.3",
@@ -1,4 +1,4 @@
1
- /* eslint-disable @typescript-eslint/sort-type-constituents -- sorting hurts readability in this case */
1
+ /* eslint-disable perfectionist/sort-union-types -- sorting hurts readability in this case */
2
2
 
3
3
  import {type ShortOptionName} from './ShortOptionName.js';
4
4
 
@@ -1,4 +1,4 @@
1
- /* eslint-disable @typescript-eslint/sort-type-constituents -- sorting hurts readability in this case */
1
+ /* eslint-disable perfectionist/sort-union-types -- sorting hurts readability in this case */
2
2
 
3
3
  export type BooleanParameterConfig =
4
4
  | {
@@ -1,54 +1,54 @@
1
1
  /** Short option name. */
2
2
  export type ShortOptionName =
3
- | 'A'
4
3
  | 'a'
5
- | 'B'
4
+ | 'A'
6
5
  | 'b'
7
- | 'C'
6
+ | 'B'
8
7
  | 'c'
9
- | 'D'
8
+ | 'C'
10
9
  | 'd'
11
- | 'E'
10
+ | 'D'
12
11
  | 'e'
13
- | 'F'
12
+ | 'E'
14
13
  | 'f'
15
- | 'G'
14
+ | 'F'
16
15
  | 'g'
17
- | 'H'
16
+ | 'G'
18
17
  | 'h'
19
- | 'I'
18
+ | 'H'
20
19
  | 'i'
21
- | 'J'
20
+ | 'I'
22
21
  | 'j'
23
- | 'K'
22
+ | 'J'
24
23
  | 'k'
25
- | 'L'
24
+ | 'K'
26
25
  | 'l'
27
- | 'M'
26
+ | 'L'
28
27
  | 'm'
29
- | 'N'
28
+ | 'M'
30
29
  | 'n'
31
- | 'O'
30
+ | 'N'
32
31
  | 'o'
33
- | 'P'
32
+ | 'O'
34
33
  | 'p'
35
- | 'Q'
34
+ | 'P'
36
35
  | 'q'
37
- | 'R'
36
+ | 'Q'
38
37
  | 'r'
39
- | 'S'
38
+ | 'R'
40
39
  | 's'
41
- | 'T'
40
+ | 'S'
42
41
  | 't'
43
- | 'U'
42
+ | 'T'
44
43
  | 'u'
45
- | 'V'
44
+ | 'U'
46
45
  | 'v'
47
- | 'W'
46
+ | 'V'
48
47
  | 'w'
49
- | 'X'
48
+ | 'W'
50
49
  | 'x'
51
- | 'Y'
50
+ | 'X'
52
51
  | 'y'
53
- | 'Z'
54
- | 'z';
52
+ | 'Y'
53
+ | 'z'
54
+ | 'Z';
@@ -11,7 +11,7 @@ import {isLongOption} from './isLongOption.js';
11
11
  export class Checker {
12
12
  errors: Error[] = [];
13
13
 
14
- checkCommandsConfig(commandsConfig: CommandsConfig | []) {
14
+ checkCommandsConfig(commandsConfig: [] | CommandsConfig) {
15
15
  for (let commandConfig of commandsConfig) {
16
16
  if (!isCommand(commandConfig)) {
17
17
  this.addError(new ValidationError('INVALID_COMMAND', {messageParameters: [commandConfig]}));
@@ -19,7 +19,7 @@ export class Checker {
19
19
  }
20
20
  }
21
21
 
22
- checkParametersConfig(parametersConfig: ParametersConfig | []) {
22
+ checkParametersConfig(parametersConfig: [] | ParametersConfig) {
23
23
  for (let [i, parameterConfig] of parametersConfig.entries()) {
24
24
  // types of choices must be correct
25
25
  if (
@@ -97,7 +97,7 @@ export class Checker {
97
97
  }
98
98
  }
99
99
 
100
- checkParsedParameters(parametersConfig: ParametersConfig | [], parsedParameters: unknown[]) {
100
+ checkParsedParameters(parametersConfig: [] | ParametersConfig, parsedParameters: unknown[]) {
101
101
  for (let [i, parameterConfig] of parametersConfig.entries()) {
102
102
  let parsedParameter = parsedParameters[i];
103
103
 
@@ -12,7 +12,7 @@ export class OptionScope {
12
12
  name: string;
13
13
 
14
14
  values: unknown[] = [];
15
- previousParsedValue?: unknown[] | unknown;
15
+ previousParsedValue?: unknown | unknown[];
16
16
  readonly config: OptionConfig;
17
17
 
18
18
  constructor(optionName: string, optionsConfig: OptionsConfig, allowUnknownOptions = false) {
@@ -70,7 +70,7 @@ export class OptionScope {
70
70
  if (
71
71
  this.config.multiple &&
72
72
  typeof this.config.arity === 'number' &&
73
- this.values.length + ((this.previousParsedValue as unknown[] | undefined) ?? []).length ===
73
+ this.values.length + ((this.previousParsedValue as undefined | unknown[]) ?? []).length ===
74
74
  this.config.arity
75
75
  ) {
76
76
  return true;
@@ -8,11 +8,11 @@ import {isFalseString} from './isFalseString.js';
8
8
  * */
9
9
  export function castValue<T extends 'boolean' | 'number' | 'string'>(
10
10
  value: string,
11
- type?: T,
11
+ targetType?: T,
12
12
  ): T extends 'boolean' ? boolean
13
13
  : T extends 'number' ? number
14
14
  : string {
15
- switch (type) {
15
+ switch (targetType) {
16
16
  case 'boolean': {
17
17
  let booleanString = String(value).toLowerCase();
18
18
 
@@ -28,7 +28,21 @@ export function castValue<T extends 'boolean' | 'number' | 'string'>(
28
28
  : string;
29
29
  }
30
30
 
31
+ case 'string': {
32
+ return String(value) as T extends 'boolean' ? boolean
33
+ : T extends 'number' ? number
34
+ : string;
35
+ }
36
+
37
+ case undefined: {
38
+ return String(value) as T extends 'boolean' ? boolean
39
+ : T extends 'number' ? number
40
+ : string;
41
+ }
42
+
31
43
  default: {
44
+ targetType satisfies never;
45
+
32
46
  return String(value) as T extends 'boolean' ? boolean
33
47
  : T extends 'number' ? number
34
48
  : string;
@@ -11,6 +11,6 @@ export * from './internals/isOptionLike.js';
11
11
  export * from './internals/isShortOption.js';
12
12
  export * from './internals/isShortOptionsGroup.js';
13
13
  export * from './internals/isTrueString.js';
14
- export * from './internals/NormalizedCommandConfig.js';
15
- export * from './internals/NormalizedCommandsConfig.js';
14
+ export type * from './internals/NormalizedCommandConfig.js';
15
+ export type * from './internals/NormalizedCommandsConfig.js';
16
16
  export * from './internals/OptionScope.js';
@@ -43,8 +43,6 @@ function commitOptionScope(optionScope: OptionScope, parsedOptions: Record<strin
43
43
  * @return Parsed arguments.
44
44
  *
45
45
  */
46
- // TODO: refactor
47
- // eslint-disable-next-line complexity -- TODO
48
46
  export function parseArguments<const O extends ParserConfig>(
49
47
  argv: Argv,
50
48
  parserConfig: O,
@@ -78,7 +76,7 @@ export function parseArguments<const O extends ParserConfig>(
78
76
  let parsedOptions: Record<string, unknown> = {};
79
77
  let parsedUnknownOptions: Record<string, unknown> = {};
80
78
  let restArgs: string[] = [];
81
- let optionScope: OptionScope | null = null;
79
+ let optionScope: null | OptionScope = null;
82
80
  let commandScope: CommandScope | null = null;
83
81
 
84
82
  //
@@ -117,10 +115,9 @@ export function parseArguments<const O extends ParserConfig>(
117
115
  );
118
116
  }
119
117
  }
120
- }
121
118
 
122
- optionScope = null;
123
- commandScope = null;
119
+ commandScope = null;
120
+ }
124
121
 
125
122
  let optionName = arg;
126
123
  let optionValue;