argue-cli 2.0.0 → 2.1.0

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.
package/README.md CHANGED
@@ -19,13 +19,13 @@
19
19
  [build]: https://img.shields.io/github/workflow/status/TrigenSoftware/Argue/CI.svg
20
20
  [build-url]: https://github.com/TrigenSoftware/Argue/actions
21
21
 
22
- [coverage]: https://img.shields.io/coveralls/TrigenSoftware/Argue.svg
23
- [coverage-url]: https://coveralls.io/r/TrigenSoftware/Argue
22
+ [coverage]: https://img.shields.io/codecov/c/github/TrigenSoftware/Argue.svg
23
+ [coverage-url]: https://app.codecov.io/gh/TrigenSoftware/Argue
24
24
 
25
25
  [size]: https://img.shields.io/bundlephobia/minzip/argue-cli
26
26
  [size-url]: https://bundlephobia.com/package/argue-cli
27
27
 
28
- A thin and strongly typed CLI argument parser for Node.js.
28
+ A thin and strongly typed CLI arguments parser for Node.js.
29
29
 
30
30
  ## Usage
31
31
 
package/dist/args.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AliasArgRef, ArgRef, PrimitiveConstructor, OptionsReaderState, OptionsReaderRead, OptionResult } from './types';
1
+ import { AliasArgRef, ArgRef, PrimitiveConstructor, OptionsReaderState, OptionsReaderRead, OptionResult } from './types.js';
2
2
  /**
3
3
  * Describe argument with aliases.
4
4
  * @param name - Main name.
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,MAAM,EACN,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACb,MAAM,SAAS,CAAA;AAGhB;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAKxG;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,oBAAoB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,YA8B/E,MAAM,QAAQ,iBAAiB,WAAW,kBAAkB,+BA6B/E"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,MAAM,EACN,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACb,MAAM,YAAY,CAAA;AAGnB;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAKxG;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,oBAAoB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,YA8B/E,MAAM,QAAQ,iBAAiB,WAAW,kBAAkB,+BA6B/E"}
package/dist/core.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ArgRef } from './types';
1
+ import { ArgRef } from './types.js';
2
2
  /**
3
3
  * Read next argument.
4
4
  * Throws error if no next argument.
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAGhC;;;;GAIG;AACH,wBAAgB,IAAI,WAQnB;AAED;;;GAGG;AACH,wBAAgB,GAAG,SAIlB;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KASpE"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAGnC;;;;GAIG;AACH,wBAAgB,IAAI,WAQnB;AAED;;;GAGG;AACH,wBAAgB,GAAG,SAIlB;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KASpE"}
package/dist/index.cjs CHANGED
@@ -26,7 +26,7 @@ const ARGV_START_INDEX = 2;
26
26
  * @param arg
27
27
  * @returns Full name or null.
28
28
  */ function matchArgName(argRef, arg) {
29
- if (typeof argRef === 'string') {
29
+ if (typeof argRef === "string") {
30
30
  return argRef === arg ? argRef : null;
31
31
  }
32
32
  if (argRef.name === arg) {
@@ -58,7 +58,7 @@ const ARGV_START_INDEX = 2;
58
58
  */ function read() {
59
59
  const value = argv.shift();
60
60
  if (!value) {
61
- throw new Error('Unexpected end of arguments');
61
+ throw new Error("Unexpected end of arguments");
62
62
  }
63
63
  return value;
64
64
  }
@@ -89,11 +89,11 @@ const ARGV_START_INDEX = 2;
89
89
  * @param alias - Alias name.
90
90
  * @param restAliases - Rest aliases.
91
91
  * @returns Description of argument with aliases..
92
- */ function alias(name, alias1, ...restAliases) {
92
+ */ function alias(name, alias, ...restAliases) {
93
93
  return {
94
94
  name,
95
95
  aliases: [
96
- alias1,
96
+ alias,
97
97
  ...restAliases
98
98
  ]
99
99
  };
@@ -105,8 +105,8 @@ const ARGV_START_INDEX = 2;
105
105
  * @returns Option reader.
106
106
  */ function option(argRef, type) {
107
107
  if (type === String) {
108
- return (option1, read)=>{
109
- const argName = matchArgName(argRef, option1);
108
+ return (option, read)=>{
109
+ const argName = matchArgName(argRef, option);
110
110
  if (argName) {
111
111
  return {
112
112
  [argName]: read()
@@ -116,8 +116,8 @@ const ARGV_START_INDEX = 2;
116
116
  };
117
117
  }
118
118
  if (type === Number) {
119
- return (option2, read)=>{
120
- const argName = matchArgName(argRef, option2);
119
+ return (option, read)=>{
120
+ const argName = matchArgName(argRef, option);
121
121
  if (argName) {
122
122
  return {
123
123
  [argName]: parseFloat(read())
@@ -127,11 +127,11 @@ const ARGV_START_INDEX = 2;
127
127
  };
128
128
  }
129
129
  if (type === Array) {
130
- return (option3, read, options)=>{
131
- const argName = matchArgName(argRef, option3);
130
+ return (option, read, options)=>{
131
+ const argName = matchArgName(argRef, option);
132
132
  if (argName) {
133
133
  const prevValues = options[argName];
134
- const values = read().split(',');
134
+ const values = read().split(",");
135
135
  return {
136
136
  [argName]: Array.isArray(prevValues) ? prevValues.concat(values) : values
137
137
  };
@@ -139,8 +139,8 @@ const ARGV_START_INDEX = 2;
139
139
  return null;
140
140
  };
141
141
  }
142
- return (option4)=>{
143
- const argName = matchArgName(argRef, option4);
142
+ return (option)=>{
143
+ const argName = matchArgName(argRef, option);
144
144
  if (argName) {
145
145
  return {
146
146
  [argName]: true
@@ -154,16 +154,14 @@ function isOption(arg) {
154
154
  return /^--?[^-].*/.test(arg);
155
155
  }
156
156
  function removePrefix(arg) {
157
- return arg.replace(/^--?/, '');
157
+ return arg.replace(/^--?/, "");
158
158
  }
159
159
  function createOptionReader(optionReaders) {
160
160
  const optionReader = optionReaders.reduceRight((readNextOption, readOption)=>{
161
161
  if (!readNextOption) {
162
162
  return readOption;
163
163
  }
164
- var ref;
165
- return (option, read, options)=>(ref = readOption(option, read, options)) !== null && ref !== void 0 ? ref : readNextOption(option, read, options)
166
- ;
164
+ return (option, read, options)=>readOption(option, read, options) ?? readNextOption(option, read, options);
167
165
  }, null);
168
166
  return optionReader;
169
167
  }
@@ -193,7 +191,7 @@ function createOptionReader(optionReaders) {
193
191
  next();
194
192
  remove();
195
193
  if (!arg) {
196
- throw new Error('Unexpected end of arguments');
194
+ throw new Error("Unexpected end of arguments");
197
195
  }
198
196
  return arg;
199
197
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/argv.ts","../src/utils.ts","../src/core.ts","../src/args.ts","../src/options.ts"],"sourcesContent":["\nconst ARGV_START_INDEX = 2\n\n/**\n * Internal state of arguments.\n */\nexport const argv = process.argv.slice(ARGV_START_INDEX)\n\n/**\n * Reset arguments state.\n */\nexport function resetArgs() {\n argv.splice(0, argv.length)\n argv.push(...process.argv.slice(ARGV_START_INDEX))\n}\n\n/**\n * Set arguments state.\n * @param args\n */\nexport function setArgs(...args: string[]) {\n argv.splice(0, argv.length)\n argv.push(...args)\n}\n","\nimport { ArgRef } from './types'\n\ntype FlatMerge<T> = T extends infer U ? { [K in keyof U]: U[K] } : never\n\nexport type Merge<T extends readonly [...unknown[]]> = T extends [infer L, ...infer R]\n ? FlatMerge<NonNullable<L> & Merge<R>>\n : unknown\n\nexport type UnionMerge<T extends readonly [...unknown[]]> = T extends [infer L, ...infer R]\n ? L | Merge<R>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n : any\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFunction = (...args: any[]) => any\n\nexport type ReturnTypes<T extends readonly [...AnyFunction[]]> = T extends [infer L, ...infer R]\n ? L extends AnyFunction\n ? R extends AnyFunction[]\n ? [ReturnType<L>, ...ReturnTypes<R>]\n : []\n : []\n : []\n\n/**\n * Match reference with argument.\n * @param argRef\n * @param arg\n * @returns Full name or null.\n */\nexport function matchArgName<T extends string>(argRef: ArgRef<T>, arg: string) {\n if (typeof argRef === 'string') {\n return argRef === arg\n ? argRef\n : null\n }\n\n if (argRef.name === arg) {\n return argRef.name\n }\n\n return argRef.aliases.includes(arg)\n ? argRef.name\n : null\n}\n\n/**\n * Find full argument name in references.\n * @param argRefs\n * @param arg\n * @returns Found argument's full name or null.\n */\nexport function findArgName<T extends string>(argRefs: [...ArgRef<T>[]], arg: string) {\n let argRef: ArgRef<T>\n let argName: T | null\n\n for (argRef of argRefs) {\n argName = matchArgName(argRef, arg)\n\n if (argName) {\n return argName\n }\n }\n\n return null\n}\n","import { argv } from './argv'\nimport { ArgRef } from './types'\nimport { findArgName } from './utils'\n\n/**\n * Read next argument.\n * Throws error if no next argument.\n * @returns Next argument.\n */\nexport function read() {\n const value = argv.shift()\n\n if (!value) {\n throw new Error('Unexpected end of arguments')\n }\n\n return value\n}\n\n/**\n * Expectation of the end.\n * Throws an error if there are more arguments left.\n */\nexport function end() {\n if (argv.length) {\n throw new Error(`Unexpected argument \"${argv[0]}\"`)\n }\n}\n\n/**\n * Expect one of the given arguments.\n * @param argRefs\n * @returns Expected full argument name.\n */\nexport function expect<T extends string>(...argRefs: [...ArgRef<T>[]]) {\n const arg = read()\n const argName = findArgName(argRefs, arg)\n\n if (!argName) {\n throw new Error(`Unexpected argument \"${arg}\"`)\n }\n\n return argName\n}\n","import {\n AliasArgRef,\n ArgRef,\n PrimitiveConstructor,\n OptionsReaderState,\n OptionsReaderRead,\n OptionResult\n} from './types'\nimport { matchArgName } from './utils'\n\n/**\n * Describe argument with aliases.\n * @param name - Main name.\n * @param alias - Alias name.\n * @param restAliases - Rest aliases.\n * @returns Description of argument with aliases..\n */\nexport function alias<T extends string>(name: T, alias: string, ...restAliases: string[]): AliasArgRef<T> {\n return {\n name,\n aliases: [alias, ...restAliases]\n }\n}\n\n/**\n * Describe option with value.\n * @param argRef - Option name.\n * @param type - Value type.\n * @returns Option reader.\n */\nexport function option<T extends string, K extends PrimitiveConstructor>(argRef: ArgRef<T>, type: K) {\n if (type === String) {\n return (option: string, read: OptionsReaderRead) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: read()\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n if (type === Number) {\n return (option: string, read: OptionsReaderRead) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: parseFloat(read())\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n if (type === Array) {\n return (option: string, read: OptionsReaderRead, options: OptionsReaderState) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n const prevValues = options[argName]\n const values = read().split(',')\n\n return {\n [argName]: Array.isArray(prevValues)\n ? prevValues.concat(values)\n : values\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n return (option: string) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: true\n } as OptionResult<T, K>\n }\n\n return null\n }\n}\n","import { argv } from './argv'\nimport { OptionReader, OptionResult } from './types'\nimport { Merge, ReturnTypes, UnionMerge } from './utils'\n\nfunction isOption(arg: string) {\n return /^--?[^-].*/.test(arg)\n}\n\nfunction removePrefix(arg: string) {\n return arg.replace(/^--?/, '')\n}\n\nfunction createOptionReader<T extends OptionReader[]>(optionReaders: [...T]) {\n const optionReader = optionReaders.reduceRight<OptionReader | null>(\n (readNextOption, readOption) => {\n if (!readNextOption) {\n return readOption\n }\n\n return (option, read, options) => readOption(option, read, options) ?? readNextOption(option, read, options)\n },\n null\n )\n\n return optionReader as OptionReader<UnionMerge<ReturnTypes<T>>> | null\n}\n\n/**\n * Read options from arguments.\n * @param optionReaders\n * @returns Options with values.\n */\nexport function readOptions<T extends OptionReader[]>(...optionReaders: [...T]): Partial<Merge<ReturnTypes<T>>> {\n if (!argv.length) {\n return {}\n }\n\n const readOption = createOptionReader(optionReaders)\n\n if (!readOption) {\n return {}\n }\n\n const options = {}\n let i = 0\n let arg = argv[i]\n let optionResult: OptionResult | null\n const next = () => {\n arg = argv[++i]\n }\n const remove = () => {\n argv.splice(i--, 1)\n }\n const read = () => {\n next()\n remove()\n\n if (!arg) {\n throw new Error('Unexpected end of arguments')\n }\n\n return arg\n }\n\n // eslint-disable-next-line no-unmodified-loop-condition\n while (arg) {\n if (isOption(arg)) {\n optionResult = readOption(removePrefix(arg), read, options)\n\n if (optionResult) {\n remove()\n Object.assign(options, optionResult)\n }\n }\n\n next()\n }\n\n return options\n}\n"],"names":["ARGV_START_INDEX","argv","process","slice","resetArgs","splice","length","push","setArgs","args","matchArgName","argRef","arg","name","aliases","includes","findArgName","argRefs","argName","read","value","shift","Error","end","expect","alias","restAliases","option","type","String","Number","parseFloat","Array","options","prevValues","values","split","isArray","concat","isOption","test","removePrefix","replace","createOptionReader","optionReaders","optionReader","reduceRight","readNextOption","readOption","readOptions","i","optionResult","next","remove","Object","assign"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/argv.ts","../src/utils.ts","../src/core.ts","../src/args.ts","../src/options.ts"],"sourcesContent":["\nconst ARGV_START_INDEX = 2\n\n/**\n * Internal state of arguments.\n */\nexport const argv = process.argv.slice(ARGV_START_INDEX)\n\n/**\n * Reset arguments state.\n */\nexport function resetArgs() {\n argv.splice(0, argv.length)\n argv.push(...process.argv.slice(ARGV_START_INDEX))\n}\n\n/**\n * Set arguments state.\n * @param args\n */\nexport function setArgs(...args: string[]) {\n argv.splice(0, argv.length)\n argv.push(...args)\n}\n","\nimport { ArgRef } from './types.js'\n\ntype FlatMerge<T> = T extends infer U ? { [K in keyof U]: U[K] } : never\n\nexport type Merge<T extends readonly [...unknown[]]> = T extends [infer L, ...infer R]\n ? FlatMerge<NonNullable<L> & Merge<R>>\n : unknown\n\nexport type UnionMerge<T extends readonly [...unknown[]]> = T extends [infer L, ...infer R]\n ? L | Merge<R>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n : any\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFunction = (...args: any[]) => any\n\nexport type ReturnTypes<T extends readonly [...AnyFunction[]]> = T extends [infer L, ...infer R]\n ? L extends AnyFunction\n ? R extends AnyFunction[]\n ? [ReturnType<L>, ...ReturnTypes<R>]\n : []\n : []\n : []\n\n/**\n * Match reference with argument.\n * @param argRef\n * @param arg\n * @returns Full name or null.\n */\nexport function matchArgName<T extends string>(argRef: ArgRef<T>, arg: string) {\n if (typeof argRef === 'string') {\n return argRef === arg\n ? argRef\n : null\n }\n\n if (argRef.name === arg) {\n return argRef.name\n }\n\n return argRef.aliases.includes(arg)\n ? argRef.name\n : null\n}\n\n/**\n * Find full argument name in references.\n * @param argRefs\n * @param arg\n * @returns Found argument's full name or null.\n */\nexport function findArgName<T extends string>(argRefs: [...ArgRef<T>[]], arg: string) {\n let argRef: ArgRef<T>\n let argName: T | null\n\n for (argRef of argRefs) {\n argName = matchArgName(argRef, arg)\n\n if (argName) {\n return argName\n }\n }\n\n return null\n}\n","import { argv } from './argv.js'\nimport { ArgRef } from './types.js'\nimport { findArgName } from './utils.js'\n\n/**\n * Read next argument.\n * Throws error if no next argument.\n * @returns Next argument.\n */\nexport function read() {\n const value = argv.shift()\n\n if (!value) {\n throw new Error('Unexpected end of arguments')\n }\n\n return value\n}\n\n/**\n * Expectation of the end.\n * Throws an error if there are more arguments left.\n */\nexport function end() {\n if (argv.length) {\n throw new Error(`Unexpected argument \"${argv[0]}\"`)\n }\n}\n\n/**\n * Expect one of the given arguments.\n * @param argRefs\n * @returns Expected full argument name.\n */\nexport function expect<T extends string>(...argRefs: [...ArgRef<T>[]]) {\n const arg = read()\n const argName = findArgName(argRefs, arg)\n\n if (!argName) {\n throw new Error(`Unexpected argument \"${arg}\"`)\n }\n\n return argName\n}\n","import {\n AliasArgRef,\n ArgRef,\n PrimitiveConstructor,\n OptionsReaderState,\n OptionsReaderRead,\n OptionResult\n} from './types.js'\nimport { matchArgName } from './utils.js'\n\n/**\n * Describe argument with aliases.\n * @param name - Main name.\n * @param alias - Alias name.\n * @param restAliases - Rest aliases.\n * @returns Description of argument with aliases..\n */\nexport function alias<T extends string>(name: T, alias: string, ...restAliases: string[]): AliasArgRef<T> {\n return {\n name,\n aliases: [alias, ...restAliases]\n }\n}\n\n/**\n * Describe option with value.\n * @param argRef - Option name.\n * @param type - Value type.\n * @returns Option reader.\n */\nexport function option<T extends string, K extends PrimitiveConstructor>(argRef: ArgRef<T>, type: K) {\n if (type === String) {\n return (option: string, read: OptionsReaderRead) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: read()\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n if (type === Number) {\n return (option: string, read: OptionsReaderRead) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: parseFloat(read())\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n if (type === Array) {\n return (option: string, read: OptionsReaderRead, options: OptionsReaderState) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n const prevValues = options[argName]\n const values = read().split(',')\n\n return {\n [argName]: Array.isArray(prevValues)\n ? prevValues.concat(values)\n : values\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n return (option: string) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: true\n } as OptionResult<T, K>\n }\n\n return null\n }\n}\n","import { argv } from './argv.js'\nimport { OptionReader, OptionResult } from './types.js'\nimport { Merge, ReturnTypes, UnionMerge } from './utils.js'\n\nfunction isOption(arg: string) {\n return /^--?[^-].*/.test(arg)\n}\n\nfunction removePrefix(arg: string) {\n return arg.replace(/^--?/, '')\n}\n\nfunction createOptionReader<T extends OptionReader[]>(optionReaders: [...T]) {\n const optionReader = optionReaders.reduceRight<OptionReader | null>(\n (readNextOption, readOption) => {\n if (!readNextOption) {\n return readOption\n }\n\n return (option, read, options) => readOption(option, read, options) ?? readNextOption(option, read, options)\n },\n null\n )\n\n return optionReader as OptionReader<UnionMerge<ReturnTypes<T>>> | null\n}\n\n/**\n * Read options from arguments.\n * @param optionReaders\n * @returns Options with values.\n */\nexport function readOptions<T extends OptionReader[]>(...optionReaders: [...T]): Partial<Merge<ReturnTypes<T>>> {\n if (!argv.length) {\n return {}\n }\n\n const readOption = createOptionReader(optionReaders)\n\n if (!readOption) {\n return {}\n }\n\n const options = {}\n let i = 0\n let arg = argv[i]\n let optionResult: OptionResult | null\n const next = () => {\n arg = argv[++i]\n }\n const remove = () => {\n argv.splice(i--, 1)\n }\n const read = () => {\n next()\n remove()\n\n if (!arg) {\n throw new Error('Unexpected end of arguments')\n }\n\n return arg\n }\n\n // eslint-disable-next-line no-unmodified-loop-condition\n while (arg) {\n if (isOption(arg)) {\n optionResult = readOption(removePrefix(arg), read, options)\n\n if (optionResult) {\n remove()\n Object.assign(options, optionResult)\n }\n }\n\n next()\n }\n\n return options\n}\n"],"names":["ARGV_START_INDEX","argv","process","slice","resetArgs","splice","length","push","setArgs","args","matchArgName","argRef","arg","name","aliases","includes","findArgName","argRefs","argName","read","value","shift","Error","end","expect","alias","restAliases","option","type","String","Number","parseFloat","Array","options","prevValues","values","split","isArray","concat","isOption","test","removePrefix","replace","createOptionReader","optionReaders","optionReader","reduceRight","readNextOption","readOption","readOptions","i","optionResult","next","remove","Object","assign"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export * from './types';
2
- export * from './argv';
3
- export * from './core';
4
- export * from './args';
5
- export * from './options';
1
+ export * from './types.js';
2
+ export * from './argv.js';
3
+ export * from './core.js';
4
+ export * from './args.js';
5
+ export * from './options.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ const ARGV_START_INDEX = 2;
22
22
  * @param arg
23
23
  * @returns Full name or null.
24
24
  */ function matchArgName(argRef, arg) {
25
- if (typeof argRef === 'string') {
25
+ if (typeof argRef === "string") {
26
26
  return argRef === arg ? argRef : null;
27
27
  }
28
28
  if (argRef.name === arg) {
@@ -54,7 +54,7 @@ const ARGV_START_INDEX = 2;
54
54
  */ function read() {
55
55
  const value = argv.shift();
56
56
  if (!value) {
57
- throw new Error('Unexpected end of arguments');
57
+ throw new Error("Unexpected end of arguments");
58
58
  }
59
59
  return value;
60
60
  }
@@ -85,11 +85,11 @@ const ARGV_START_INDEX = 2;
85
85
  * @param alias - Alias name.
86
86
  * @param restAliases - Rest aliases.
87
87
  * @returns Description of argument with aliases..
88
- */ function alias(name, alias1, ...restAliases) {
88
+ */ function alias(name, alias, ...restAliases) {
89
89
  return {
90
90
  name,
91
91
  aliases: [
92
- alias1,
92
+ alias,
93
93
  ...restAliases
94
94
  ]
95
95
  };
@@ -101,8 +101,8 @@ const ARGV_START_INDEX = 2;
101
101
  * @returns Option reader.
102
102
  */ function option(argRef, type) {
103
103
  if (type === String) {
104
- return (option1, read)=>{
105
- const argName = matchArgName(argRef, option1);
104
+ return (option, read)=>{
105
+ const argName = matchArgName(argRef, option);
106
106
  if (argName) {
107
107
  return {
108
108
  [argName]: read()
@@ -112,8 +112,8 @@ const ARGV_START_INDEX = 2;
112
112
  };
113
113
  }
114
114
  if (type === Number) {
115
- return (option2, read)=>{
116
- const argName = matchArgName(argRef, option2);
115
+ return (option, read)=>{
116
+ const argName = matchArgName(argRef, option);
117
117
  if (argName) {
118
118
  return {
119
119
  [argName]: parseFloat(read())
@@ -123,11 +123,11 @@ const ARGV_START_INDEX = 2;
123
123
  };
124
124
  }
125
125
  if (type === Array) {
126
- return (option3, read, options)=>{
127
- const argName = matchArgName(argRef, option3);
126
+ return (option, read, options)=>{
127
+ const argName = matchArgName(argRef, option);
128
128
  if (argName) {
129
129
  const prevValues = options[argName];
130
- const values = read().split(',');
130
+ const values = read().split(",");
131
131
  return {
132
132
  [argName]: Array.isArray(prevValues) ? prevValues.concat(values) : values
133
133
  };
@@ -135,8 +135,8 @@ const ARGV_START_INDEX = 2;
135
135
  return null;
136
136
  };
137
137
  }
138
- return (option4)=>{
139
- const argName = matchArgName(argRef, option4);
138
+ return (option)=>{
139
+ const argName = matchArgName(argRef, option);
140
140
  if (argName) {
141
141
  return {
142
142
  [argName]: true
@@ -150,15 +150,14 @@ function isOption(arg) {
150
150
  return /^--?[^-].*/.test(arg);
151
151
  }
152
152
  function removePrefix(arg) {
153
- return arg.replace(/^--?/, '');
153
+ return arg.replace(/^--?/, "");
154
154
  }
155
155
  function createOptionReader(optionReaders) {
156
156
  const optionReader = optionReaders.reduceRight((readNextOption, readOption)=>{
157
157
  if (!readNextOption) {
158
158
  return readOption;
159
159
  }
160
- return (option, read, options)=>readOption(option, read, options) ?? readNextOption(option, read, options)
161
- ;
160
+ return (option, read, options)=>readOption(option, read, options) ?? readNextOption(option, read, options);
162
161
  }, null);
163
162
  return optionReader;
164
163
  }
@@ -188,7 +187,7 @@ function createOptionReader(optionReaders) {
188
187
  next();
189
188
  remove();
190
189
  if (!arg) {
191
- throw new Error('Unexpected end of arguments');
190
+ throw new Error("Unexpected end of arguments");
192
191
  }
193
192
  return arg;
194
193
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/argv.ts","../src/utils.ts","../src/core.ts","../src/args.ts","../src/options.ts"],"sourcesContent":["\nconst ARGV_START_INDEX = 2\n\n/**\n * Internal state of arguments.\n */\nexport const argv = process.argv.slice(ARGV_START_INDEX)\n\n/**\n * Reset arguments state.\n */\nexport function resetArgs() {\n argv.splice(0, argv.length)\n argv.push(...process.argv.slice(ARGV_START_INDEX))\n}\n\n/**\n * Set arguments state.\n * @param args\n */\nexport function setArgs(...args: string[]) {\n argv.splice(0, argv.length)\n argv.push(...args)\n}\n","\nimport { ArgRef } from './types'\n\ntype FlatMerge<T> = T extends infer U ? { [K in keyof U]: U[K] } : never\n\nexport type Merge<T extends readonly [...unknown[]]> = T extends [infer L, ...infer R]\n ? FlatMerge<NonNullable<L> & Merge<R>>\n : unknown\n\nexport type UnionMerge<T extends readonly [...unknown[]]> = T extends [infer L, ...infer R]\n ? L | Merge<R>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n : any\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFunction = (...args: any[]) => any\n\nexport type ReturnTypes<T extends readonly [...AnyFunction[]]> = T extends [infer L, ...infer R]\n ? L extends AnyFunction\n ? R extends AnyFunction[]\n ? [ReturnType<L>, ...ReturnTypes<R>]\n : []\n : []\n : []\n\n/**\n * Match reference with argument.\n * @param argRef\n * @param arg\n * @returns Full name or null.\n */\nexport function matchArgName<T extends string>(argRef: ArgRef<T>, arg: string) {\n if (typeof argRef === 'string') {\n return argRef === arg\n ? argRef\n : null\n }\n\n if (argRef.name === arg) {\n return argRef.name\n }\n\n return argRef.aliases.includes(arg)\n ? argRef.name\n : null\n}\n\n/**\n * Find full argument name in references.\n * @param argRefs\n * @param arg\n * @returns Found argument's full name or null.\n */\nexport function findArgName<T extends string>(argRefs: [...ArgRef<T>[]], arg: string) {\n let argRef: ArgRef<T>\n let argName: T | null\n\n for (argRef of argRefs) {\n argName = matchArgName(argRef, arg)\n\n if (argName) {\n return argName\n }\n }\n\n return null\n}\n","import { argv } from './argv'\nimport { ArgRef } from './types'\nimport { findArgName } from './utils'\n\n/**\n * Read next argument.\n * Throws error if no next argument.\n * @returns Next argument.\n */\nexport function read() {\n const value = argv.shift()\n\n if (!value) {\n throw new Error('Unexpected end of arguments')\n }\n\n return value\n}\n\n/**\n * Expectation of the end.\n * Throws an error if there are more arguments left.\n */\nexport function end() {\n if (argv.length) {\n throw new Error(`Unexpected argument \"${argv[0]}\"`)\n }\n}\n\n/**\n * Expect one of the given arguments.\n * @param argRefs\n * @returns Expected full argument name.\n */\nexport function expect<T extends string>(...argRefs: [...ArgRef<T>[]]) {\n const arg = read()\n const argName = findArgName(argRefs, arg)\n\n if (!argName) {\n throw new Error(`Unexpected argument \"${arg}\"`)\n }\n\n return argName\n}\n","import {\n AliasArgRef,\n ArgRef,\n PrimitiveConstructor,\n OptionsReaderState,\n OptionsReaderRead,\n OptionResult\n} from './types'\nimport { matchArgName } from './utils'\n\n/**\n * Describe argument with aliases.\n * @param name - Main name.\n * @param alias - Alias name.\n * @param restAliases - Rest aliases.\n * @returns Description of argument with aliases..\n */\nexport function alias<T extends string>(name: T, alias: string, ...restAliases: string[]): AliasArgRef<T> {\n return {\n name,\n aliases: [alias, ...restAliases]\n }\n}\n\n/**\n * Describe option with value.\n * @param argRef - Option name.\n * @param type - Value type.\n * @returns Option reader.\n */\nexport function option<T extends string, K extends PrimitiveConstructor>(argRef: ArgRef<T>, type: K) {\n if (type === String) {\n return (option: string, read: OptionsReaderRead) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: read()\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n if (type === Number) {\n return (option: string, read: OptionsReaderRead) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: parseFloat(read())\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n if (type === Array) {\n return (option: string, read: OptionsReaderRead, options: OptionsReaderState) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n const prevValues = options[argName]\n const values = read().split(',')\n\n return {\n [argName]: Array.isArray(prevValues)\n ? prevValues.concat(values)\n : values\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n return (option: string) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: true\n } as OptionResult<T, K>\n }\n\n return null\n }\n}\n","import { argv } from './argv'\nimport { OptionReader, OptionResult } from './types'\nimport { Merge, ReturnTypes, UnionMerge } from './utils'\n\nfunction isOption(arg: string) {\n return /^--?[^-].*/.test(arg)\n}\n\nfunction removePrefix(arg: string) {\n return arg.replace(/^--?/, '')\n}\n\nfunction createOptionReader<T extends OptionReader[]>(optionReaders: [...T]) {\n const optionReader = optionReaders.reduceRight<OptionReader | null>(\n (readNextOption, readOption) => {\n if (!readNextOption) {\n return readOption\n }\n\n return (option, read, options) => readOption(option, read, options) ?? readNextOption(option, read, options)\n },\n null\n )\n\n return optionReader as OptionReader<UnionMerge<ReturnTypes<T>>> | null\n}\n\n/**\n * Read options from arguments.\n * @param optionReaders\n * @returns Options with values.\n */\nexport function readOptions<T extends OptionReader[]>(...optionReaders: [...T]): Partial<Merge<ReturnTypes<T>>> {\n if (!argv.length) {\n return {}\n }\n\n const readOption = createOptionReader(optionReaders)\n\n if (!readOption) {\n return {}\n }\n\n const options = {}\n let i = 0\n let arg = argv[i]\n let optionResult: OptionResult | null\n const next = () => {\n arg = argv[++i]\n }\n const remove = () => {\n argv.splice(i--, 1)\n }\n const read = () => {\n next()\n remove()\n\n if (!arg) {\n throw new Error('Unexpected end of arguments')\n }\n\n return arg\n }\n\n // eslint-disable-next-line no-unmodified-loop-condition\n while (arg) {\n if (isOption(arg)) {\n optionResult = readOption(removePrefix(arg), read, options)\n\n if (optionResult) {\n remove()\n Object.assign(options, optionResult)\n }\n }\n\n next()\n }\n\n return options\n}\n"],"names":["ARGV_START_INDEX","argv","process","slice","resetArgs","splice","length","push","setArgs","args","matchArgName","argRef","arg","name","aliases","includes","findArgName","argRefs","argName","read","value","shift","Error","end","expect","alias","restAliases","option","type","String","Number","parseFloat","Array","options","prevValues","values","split","isArray","concat","isOption","test","removePrefix","replace","createOptionReader","optionReaders","optionReader","reduceRight","readNextOption","readOption","readOptions","i","optionResult","next","remove","Object","assign"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/argv.ts","../src/utils.ts","../src/core.ts","../src/args.ts","../src/options.ts"],"sourcesContent":["\nconst ARGV_START_INDEX = 2\n\n/**\n * Internal state of arguments.\n */\nexport const argv = process.argv.slice(ARGV_START_INDEX)\n\n/**\n * Reset arguments state.\n */\nexport function resetArgs() {\n argv.splice(0, argv.length)\n argv.push(...process.argv.slice(ARGV_START_INDEX))\n}\n\n/**\n * Set arguments state.\n * @param args\n */\nexport function setArgs(...args: string[]) {\n argv.splice(0, argv.length)\n argv.push(...args)\n}\n","\nimport { ArgRef } from './types.js'\n\ntype FlatMerge<T> = T extends infer U ? { [K in keyof U]: U[K] } : never\n\nexport type Merge<T extends readonly [...unknown[]]> = T extends [infer L, ...infer R]\n ? FlatMerge<NonNullable<L> & Merge<R>>\n : unknown\n\nexport type UnionMerge<T extends readonly [...unknown[]]> = T extends [infer L, ...infer R]\n ? L | Merge<R>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n : any\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFunction = (...args: any[]) => any\n\nexport type ReturnTypes<T extends readonly [...AnyFunction[]]> = T extends [infer L, ...infer R]\n ? L extends AnyFunction\n ? R extends AnyFunction[]\n ? [ReturnType<L>, ...ReturnTypes<R>]\n : []\n : []\n : []\n\n/**\n * Match reference with argument.\n * @param argRef\n * @param arg\n * @returns Full name or null.\n */\nexport function matchArgName<T extends string>(argRef: ArgRef<T>, arg: string) {\n if (typeof argRef === 'string') {\n return argRef === arg\n ? argRef\n : null\n }\n\n if (argRef.name === arg) {\n return argRef.name\n }\n\n return argRef.aliases.includes(arg)\n ? argRef.name\n : null\n}\n\n/**\n * Find full argument name in references.\n * @param argRefs\n * @param arg\n * @returns Found argument's full name or null.\n */\nexport function findArgName<T extends string>(argRefs: [...ArgRef<T>[]], arg: string) {\n let argRef: ArgRef<T>\n let argName: T | null\n\n for (argRef of argRefs) {\n argName = matchArgName(argRef, arg)\n\n if (argName) {\n return argName\n }\n }\n\n return null\n}\n","import { argv } from './argv.js'\nimport { ArgRef } from './types.js'\nimport { findArgName } from './utils.js'\n\n/**\n * Read next argument.\n * Throws error if no next argument.\n * @returns Next argument.\n */\nexport function read() {\n const value = argv.shift()\n\n if (!value) {\n throw new Error('Unexpected end of arguments')\n }\n\n return value\n}\n\n/**\n * Expectation of the end.\n * Throws an error if there are more arguments left.\n */\nexport function end() {\n if (argv.length) {\n throw new Error(`Unexpected argument \"${argv[0]}\"`)\n }\n}\n\n/**\n * Expect one of the given arguments.\n * @param argRefs\n * @returns Expected full argument name.\n */\nexport function expect<T extends string>(...argRefs: [...ArgRef<T>[]]) {\n const arg = read()\n const argName = findArgName(argRefs, arg)\n\n if (!argName) {\n throw new Error(`Unexpected argument \"${arg}\"`)\n }\n\n return argName\n}\n","import {\n AliasArgRef,\n ArgRef,\n PrimitiveConstructor,\n OptionsReaderState,\n OptionsReaderRead,\n OptionResult\n} from './types.js'\nimport { matchArgName } from './utils.js'\n\n/**\n * Describe argument with aliases.\n * @param name - Main name.\n * @param alias - Alias name.\n * @param restAliases - Rest aliases.\n * @returns Description of argument with aliases..\n */\nexport function alias<T extends string>(name: T, alias: string, ...restAliases: string[]): AliasArgRef<T> {\n return {\n name,\n aliases: [alias, ...restAliases]\n }\n}\n\n/**\n * Describe option with value.\n * @param argRef - Option name.\n * @param type - Value type.\n * @returns Option reader.\n */\nexport function option<T extends string, K extends PrimitiveConstructor>(argRef: ArgRef<T>, type: K) {\n if (type === String) {\n return (option: string, read: OptionsReaderRead) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: read()\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n if (type === Number) {\n return (option: string, read: OptionsReaderRead) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: parseFloat(read())\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n if (type === Array) {\n return (option: string, read: OptionsReaderRead, options: OptionsReaderState) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n const prevValues = options[argName]\n const values = read().split(',')\n\n return {\n [argName]: Array.isArray(prevValues)\n ? prevValues.concat(values)\n : values\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\n return (option: string) => {\n const argName = matchArgName(argRef, option)\n\n if (argName) {\n return {\n [argName]: true\n } as OptionResult<T, K>\n }\n\n return null\n }\n}\n","import { argv } from './argv.js'\nimport { OptionReader, OptionResult } from './types.js'\nimport { Merge, ReturnTypes, UnionMerge } from './utils.js'\n\nfunction isOption(arg: string) {\n return /^--?[^-].*/.test(arg)\n}\n\nfunction removePrefix(arg: string) {\n return arg.replace(/^--?/, '')\n}\n\nfunction createOptionReader<T extends OptionReader[]>(optionReaders: [...T]) {\n const optionReader = optionReaders.reduceRight<OptionReader | null>(\n (readNextOption, readOption) => {\n if (!readNextOption) {\n return readOption\n }\n\n return (option, read, options) => readOption(option, read, options) ?? readNextOption(option, read, options)\n },\n null\n )\n\n return optionReader as OptionReader<UnionMerge<ReturnTypes<T>>> | null\n}\n\n/**\n * Read options from arguments.\n * @param optionReaders\n * @returns Options with values.\n */\nexport function readOptions<T extends OptionReader[]>(...optionReaders: [...T]): Partial<Merge<ReturnTypes<T>>> {\n if (!argv.length) {\n return {}\n }\n\n const readOption = createOptionReader(optionReaders)\n\n if (!readOption) {\n return {}\n }\n\n const options = {}\n let i = 0\n let arg = argv[i]\n let optionResult: OptionResult | null\n const next = () => {\n arg = argv[++i]\n }\n const remove = () => {\n argv.splice(i--, 1)\n }\n const read = () => {\n next()\n remove()\n\n if (!arg) {\n throw new Error('Unexpected end of arguments')\n }\n\n return arg\n }\n\n // eslint-disable-next-line no-unmodified-loop-condition\n while (arg) {\n if (isOption(arg)) {\n optionResult = readOption(removePrefix(arg), read, options)\n\n if (optionResult) {\n remove()\n Object.assign(options, optionResult)\n }\n }\n\n next()\n }\n\n return options\n}\n"],"names":["ARGV_START_INDEX","argv","process","slice","resetArgs","splice","length","push","setArgs","args","matchArgName","argRef","arg","name","aliases","includes","findArgName","argRefs","argName","read","value","shift","Error","end","expect","alias","restAliases","option","type","String","Number","parseFloat","Array","options","prevValues","values","split","isArray","concat","isOption","test","removePrefix","replace","createOptionReader","optionReaders","optionReader","reduceRight","readNextOption","readOption","readOptions","i","optionResult","next","remove","Object","assign"],"mappings":"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"}
package/dist/options.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { OptionReader } from './types';
2
- import { Merge, ReturnTypes } from './utils';
1
+ import { OptionReader } from './types.js';
2
+ import { Merge, ReturnTypes } from './utils.js';
3
3
  /**
4
4
  * Read options from arguments.
5
5
  * @param optionReaders
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAc,MAAM,SAAS,CAAA;AAyBxD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CA+C9G"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAA;AAyB3D;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CA+C9G"}
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ArgRef } from './types';
1
+ import { ArgRef } from './types.js';
2
2
  declare type FlatMerge<T> = T extends infer U ? {
3
3
  [K in keyof U]: U[K];
4
4
  } : never;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,aAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAA;AAExE,oBAAY,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GAClF,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GACpC,OAAO,CAAA;AAEX,oBAAY,UAAU,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GACvF,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAEZ,GAAG,CAAA;AAGP,aAAK,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;AAE1C,oBAAY,WAAW,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GAC5F,CAAC,SAAS,WAAW,GACnB,CAAC,SAAS,WAAW,EAAE,GACrB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GAClC,EAAE,GACJ,EAAE,GACJ,EAAE,CAAA;AAEN;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,YAc5E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,YAanF"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnC,aAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAA;AAExE,oBAAY,KAAK,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GAClF,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GACpC,OAAO,CAAA;AAEX,oBAAY,UAAU,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GACvF,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAEZ,GAAG,CAAA;AAGP,aAAK,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;AAE1C,oBAAY,WAAW,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GAC5F,CAAC,SAAS,WAAW,GACnB,CAAC,SAAS,WAAW,EAAE,GACrB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GAClC,EAAE,GACJ,EAAE,GACJ,EAAE,CAAA;AAEN;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,YAc5E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,YAanF"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "argue-cli",
3
3
  "type": "module",
4
- "version": "2.0.0",
5
- "description": "A thin and strongly typed CLI argument parser for Node.js.",
4
+ "version": "2.1.0",
5
+ "description": "A thin and strongly typed CLI arguments parser for Node.js.",
6
6
  "author": "dangreen",
7
7
  "license": "MIT",
8
8
  "repository": {
@@ -12,24 +12,6 @@
12
12
  "bugs": {
13
13
  "url": "https://github.com/TrigenSoftware/Argue/issues"
14
14
  },
15
- "main": "./dist/index.cjs",
16
- "types": "./dist/index.d.ts",
17
- "publishConfig": {
18
- "main": "./dist/index.cjs",
19
- "module": "./dist/index.js",
20
- "exports": {
21
- "import": {
22
- "default": "./dist/index.js"
23
- },
24
- "require": {
25
- "default": "./dist/index.cjs"
26
- }
27
- },
28
- "directory": "package"
29
- },
30
- "engines": {
31
- "node": ">=14.0.0"
32
- },
33
15
  "keywords": [
34
16
  "cli",
35
17
  "arguments",
@@ -37,18 +19,20 @@
37
19
  "console",
38
20
  "terminal"
39
21
  ],
22
+ "engines": {
23
+ "node": ">=14.0.0"
24
+ },
25
+ "types": "./dist/index.d.ts",
26
+ "exports": {
27
+ "import": "./dist/index.js",
28
+ "require": "./dist/index.cjs"
29
+ },
30
+ "publishConfig": {
31
+ "directory": "package"
32
+ },
40
33
  "files": [
41
34
  "dist"
42
35
  ],
43
36
  "readme": "",
44
- "scripts": {},
45
- "module": "./dist/index.js",
46
- "exports": {
47
- "import": {
48
- "default": "./dist/index.js"
49
- },
50
- "require": {
51
- "default": "./dist/index.cjs"
52
- }
53
- }
37
+ "scripts": {}
54
38
  }