argue-cli 2.0.0-2 → 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 +5 -1
- package/dist/args.d.ts +1 -1
- package/dist/args.d.ts.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.d.ts.map +1 -1
- package/dist/index.cjs +16 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -17
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +2 -2
- package/dist/options.d.ts.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/package.json +14 -30
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
[![Node version][node]][node-url]
|
|
5
5
|
[![Dependencies status][deps]][deps-url]
|
|
6
6
|
[![Build status][build]][build-url]
|
|
7
|
+
[![Coverage status][coverage]][coverage-url]
|
|
7
8
|
[![Bundle size][size]][size-url]
|
|
8
9
|
|
|
9
10
|
[npm]: https://img.shields.io/npm/v/argue-cli.svg
|
|
@@ -18,10 +19,13 @@
|
|
|
18
19
|
[build]: https://img.shields.io/github/workflow/status/TrigenSoftware/Argue/CI.svg
|
|
19
20
|
[build-url]: https://github.com/TrigenSoftware/Argue/actions
|
|
20
21
|
|
|
22
|
+
[coverage]: https://img.shields.io/codecov/c/github/TrigenSoftware/Argue.svg
|
|
23
|
+
[coverage-url]: https://app.codecov.io/gh/TrigenSoftware/Argue
|
|
24
|
+
|
|
21
25
|
[size]: https://img.shields.io/bundlephobia/minzip/argue-cli
|
|
22
26
|
[size-url]: https://bundlephobia.com/package/argue-cli
|
|
23
27
|
|
|
24
|
-
A thin and strongly typed CLI
|
|
28
|
+
A thin and strongly typed CLI arguments parser for Node.js.
|
|
25
29
|
|
|
26
30
|
## Usage
|
|
27
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.
|
package/dist/args.d.ts.map
CHANGED
|
@@ -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,
|
|
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
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
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 ===
|
|
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(
|
|
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,
|
|
92
|
+
*/ function alias(name, alias, ...restAliases) {
|
|
93
93
|
return {
|
|
94
94
|
name,
|
|
95
95
|
aliases: [
|
|
96
|
-
|
|
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 (
|
|
109
|
-
const argName = matchArgName(argRef,
|
|
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 (
|
|
120
|
-
const argName = matchArgName(argRef,
|
|
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 (
|
|
131
|
-
const argName = matchArgName(argRef,
|
|
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 (
|
|
143
|
-
const argName = matchArgName(argRef,
|
|
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
|
-
|
|
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(
|
|
194
|
+
throw new Error("Unexpected end of arguments");
|
|
197
195
|
}
|
|
198
196
|
return arg;
|
|
199
197
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
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 ===
|
|
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(
|
|
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,
|
|
88
|
+
*/ function alias(name, alias, ...restAliases) {
|
|
89
89
|
return {
|
|
90
90
|
name,
|
|
91
91
|
aliases: [
|
|
92
|
-
|
|
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 (
|
|
105
|
-
const argName = matchArgName(argRef,
|
|
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 (
|
|
116
|
-
const argName = matchArgName(argRef,
|
|
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 (
|
|
127
|
-
const argName = matchArgName(argRef,
|
|
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 (
|
|
139
|
-
const argName = matchArgName(argRef,
|
|
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(
|
|
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
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAgB,MAAM,
|
|
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
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
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.
|
|
5
|
-
"description": "A thin and strongly typed CLI
|
|
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
|
}
|