argue-cli 3.1.0 → 3.2.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 +2 -1
- package/dist/args.d.ts +2 -2
- package/dist/args.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -185,7 +185,7 @@ autocase(alias('save-dev', 'D'))
|
|
|
185
185
|
### option
|
|
186
186
|
|
|
187
187
|
```ts
|
|
188
|
-
function option(argRef: ArgRef, type:
|
|
188
|
+
function option(argRef: ArgRef, type: OptionConstructor): OptionReader
|
|
189
189
|
```
|
|
190
190
|
|
|
191
191
|
Describes an option with a value of the given type, to be read by [`readOptions`](#readoptions):
|
|
@@ -194,6 +194,7 @@ Describes an option with a value of the given type, to be read by [`readOptions`
|
|
|
194
194
|
- `Number` — parses the next argument as a number: `--port 8080`
|
|
195
195
|
- `Boolean` — a flag without a value, `true` when present: `--verbose`
|
|
196
196
|
- `Array` — splits the next argument by commas; repeated options are merged: `--plugins eslint,swc --plugins tsc` → `['eslint', 'swc', 'tsc']`
|
|
197
|
+
- `[String]` or `[Number]` — takes the next argument as a whole; repeated options are collected: `--match '*.{js,ts}' --match '*.css'` → `['*.{js,ts}', '*.css']`. Use it instead of `Array` for values that may contain commas of their own
|
|
197
198
|
|
|
198
199
|
### flag
|
|
199
200
|
|
package/dist/args.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AliasArgRef, ArgRef,
|
|
1
|
+
import type { AliasArgRef, ArgRef, OptionConstructor, OptionsReaderState, OptionsReaderRead, OptionResult } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Describe argument with aliases.
|
|
4
4
|
* @param name - Main name.
|
|
@@ -20,7 +20,7 @@ export declare function autocase<T extends string>(argRef: ArgRef<T>): ArgRef<T>
|
|
|
20
20
|
* @param type - Value type.
|
|
21
21
|
* @returns Option reader.
|
|
22
22
|
*/
|
|
23
|
-
export declare function option<T extends string, K extends
|
|
23
|
+
export declare function option<T extends string, K extends OptionConstructor>(argRef: ArgRef<T>, type: K): (option: string, read: OptionsReaderRead, options: OptionsReaderState) => OptionResult<T, K> | null;
|
|
24
24
|
/**
|
|
25
25
|
* Describe boolean flag with `--no-*` negation support.
|
|
26
26
|
* @param argRef - Flag 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,KAAK,EACV,WAAW,EACX,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,iBAAiB,EACjB,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;AAUD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAuBvE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,YAE5E,MAAM,QAAQ,iBAAiB,WAAW,kBAAkB,+BA4E/E;AAID;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,YACtC,MAAM,gDAiBvB"}
|
package/dist/index.js
CHANGED
|
@@ -133,6 +133,15 @@ function autocase(argRef) {
|
|
|
133
133
|
* @returns Option reader.
|
|
134
134
|
*/
|
|
135
135
|
function option(argRef, type) {
|
|
136
|
+
if (Array.isArray(type)) return (option, read, options) => {
|
|
137
|
+
const argName = matchArgName(argRef, option);
|
|
138
|
+
if (argName) {
|
|
139
|
+
const prevValues = options[argName];
|
|
140
|
+
const value = read();
|
|
141
|
+
return { [argName]: (Array.isArray(prevValues) ? prevValues : []).concat(type[0] === Number ? parseFloat(value) : value) };
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
};
|
|
136
145
|
if (type === String) return (option, read) => {
|
|
137
146
|
const argName = matchArgName(argRef, option);
|
|
138
147
|
if (argName) return { [argName]: read() };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"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 type { 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 // oxlint-disable-next-line typescript/no-explicit-any\n : any\n\n// oxlint-disable-next-line typescript/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 type { ArgRef } from './types.js'\nimport { argv } from './argv.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 * Read all remaining arguments.\n * @returns Remaining arguments, empty array if none.\n */\nexport function rest() {\n return argv.splice(0, argv.length)\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 type {\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\nfunction caseTwin(name: string) {\n return name.length > 1\n ? name.includes('-')\n ? name.replace(/-+(.)/g, (_, char: string) => char.toUpperCase())\n : name.replace(/[A-Z]/g, char => `-${char.toLowerCase()}`)\n : name\n}\n\n/**\n * Describe argument that matches both camelCase and kebab-case forms.\n * Name and every alias longer than one character get the twin form as an alias.\n * @param argRef - Argument name in either form.\n * @returns Description of argument with the twin forms as aliases.\n */\nexport function autocase<T extends string>(argRef: ArgRef<T>): ArgRef<T> {\n let name\n let aliases\n\n if (typeof argRef === 'string') {\n name = argRef\n aliases = new Set<string>()\n } else {\n name = argRef.name\n aliases = new Set(argRef.aliases.concat(argRef.aliases.map(caseTwin)))\n }\n\n aliases.add(caseTwin(name))\n aliases.delete(name)\n\n if (!aliases.size) {\n return argRef\n }\n\n return {\n name,\n aliases: [...aliases]\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\nconst NEGATION_PREFIX = 'no-'\n\n/**\n * Describe boolean flag with `--no-*` negation support.\n * @param argRef - Flag name.\n * @returns Option reader.\n */\nexport function flag<T extends string>(argRef: ArgRef<T>) {\n return (option: string) => {\n let value = true\n let argName = matchArgName(argRef, option)\n\n if (!argName && option.startsWith(NEGATION_PREFIX)) {\n value = false\n argName = matchArgName(argRef, option.slice(NEGATION_PREFIX.length))\n }\n\n if (argName) {\n return {\n [argName]: value\n } as OptionResult<T, BooleanConstructor>\n }\n\n return null\n }\n}\n","import type {\n OptionReader,\n OptionResult\n} from './types.js'\nimport type {\n Merge,\n ReturnTypes,\n UnionMerge\n} from './utils.js'\nimport { argv } from './argv.js'\n\nfunction isOption(arg: string) {\n return /^--?[^-].*/.test(arg)\n}\n\nfunction removePrefix(arg: string) {\n return arg.replace(/^--?/, '')\n}\n\nfunction splitOption(arg: string): [name: string, value?: string] {\n const eqIndex = arg.indexOf('=')\n\n return eqIndex === -1\n ? [arg]\n : [arg.slice(0, eqIndex), arg.slice(eqIndex + 1)]\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 let optionEqValue: string | undefined\n const next = () => {\n arg = argv[++i]\n }\n const remove = () => {\n if (optionEqValue !== undefined) {\n throw new Error(`Unexpected value for \"${arg}\"`)\n }\n\n argv.splice(i--, 1)\n }\n const read = () => {\n if (optionEqValue !== undefined) {\n const value = optionEqValue\n\n optionEqValue = undefined\n\n return value\n }\n\n next()\n remove()\n\n if (!arg) {\n throw new Error('Unexpected end of arguments')\n }\n\n return arg\n }\n\n // oxlint-disable-next-line eslint/no-unmodified-loop-condition\n while (arg) {\n if (isOption(arg)) {\n [arg, optionEqValue] = splitOption(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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"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 type { 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 // oxlint-disable-next-line typescript/no-explicit-any\n : any\n\n// oxlint-disable-next-line typescript/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 type { ArgRef } from './types.js'\nimport { argv } from './argv.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 * Read all remaining arguments.\n * @returns Remaining arguments, empty array if none.\n */\nexport function rest() {\n return argv.splice(0, argv.length)\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 type {\n AliasArgRef,\n ArgRef,\n OptionConstructor,\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\nfunction caseTwin(name: string) {\n return name.length > 1\n ? name.includes('-')\n ? name.replace(/-+(.)/g, (_, char: string) => char.toUpperCase())\n : name.replace(/[A-Z]/g, char => `-${char.toLowerCase()}`)\n : name\n}\n\n/**\n * Describe argument that matches both camelCase and kebab-case forms.\n * Name and every alias longer than one character get the twin form as an alias.\n * @param argRef - Argument name in either form.\n * @returns Description of argument with the twin forms as aliases.\n */\nexport function autocase<T extends string>(argRef: ArgRef<T>): ArgRef<T> {\n let name\n let aliases\n\n if (typeof argRef === 'string') {\n name = argRef\n aliases = new Set<string>()\n } else {\n name = argRef.name\n aliases = new Set(argRef.aliases.concat(argRef.aliases.map(caseTwin)))\n }\n\n aliases.add(caseTwin(name))\n aliases.delete(name)\n\n if (!aliases.size) {\n return argRef\n }\n\n return {\n name,\n aliases: [...aliases]\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 OptionConstructor>(argRef: ArgRef<T>, type: K) {\n if (Array.isArray(type)) {\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 value = read()\n\n return {\n [argName]: (Array.isArray(prevValues) ? prevValues : []).concat(\n type[0] === Number ? parseFloat(value) : value\n )\n } as OptionResult<T, K>\n }\n\n return null\n }\n }\n\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\nconst NEGATION_PREFIX = 'no-'\n\n/**\n * Describe boolean flag with `--no-*` negation support.\n * @param argRef - Flag name.\n * @returns Option reader.\n */\nexport function flag<T extends string>(argRef: ArgRef<T>) {\n return (option: string) => {\n let value = true\n let argName = matchArgName(argRef, option)\n\n if (!argName && option.startsWith(NEGATION_PREFIX)) {\n value = false\n argName = matchArgName(argRef, option.slice(NEGATION_PREFIX.length))\n }\n\n if (argName) {\n return {\n [argName]: value\n } as OptionResult<T, BooleanConstructor>\n }\n\n return null\n }\n}\n","import type {\n OptionReader,\n OptionResult\n} from './types.js'\nimport type {\n Merge,\n ReturnTypes,\n UnionMerge\n} from './utils.js'\nimport { argv } from './argv.js'\n\nfunction isOption(arg: string) {\n return /^--?[^-].*/.test(arg)\n}\n\nfunction removePrefix(arg: string) {\n return arg.replace(/^--?/, '')\n}\n\nfunction splitOption(arg: string): [name: string, value?: string] {\n const eqIndex = arg.indexOf('=')\n\n return eqIndex === -1\n ? [arg]\n : [arg.slice(0, eqIndex), arg.slice(eqIndex + 1)]\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 let optionEqValue: string | undefined\n const next = () => {\n arg = argv[++i]\n }\n const remove = () => {\n if (optionEqValue !== undefined) {\n throw new Error(`Unexpected value for \"${arg}\"`)\n }\n\n argv.splice(i--, 1)\n }\n const read = () => {\n if (optionEqValue !== undefined) {\n const value = optionEqValue\n\n optionEqValue = undefined\n\n return value\n }\n\n next()\n remove()\n\n if (!arg) {\n throw new Error('Unexpected end of arguments')\n }\n\n return arg\n }\n\n // oxlint-disable-next-line eslint/no-unmodified-loop-condition\n while (arg) {\n if (isOption(arg)) {\n [arg, optionEqValue] = splitOption(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"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -8,7 +8,9 @@ export type ArgRefName<T extends ArgRef<string>> = T extends AliasArgRef<string>
|
|
|
8
8
|
export type OptionsReaderState = Record<string, unknown>;
|
|
9
9
|
export type OptionsReaderRead = () => string;
|
|
10
10
|
export type PrimitiveConstructor = StringConstructor | NumberConstructor | ArrayConstructor | BooleanConstructor;
|
|
11
|
-
export type
|
|
12
|
-
export type
|
|
11
|
+
export type ListConstructor = [StringConstructor] | [NumberConstructor];
|
|
12
|
+
export type OptionConstructor = PrimitiveConstructor | ListConstructor;
|
|
13
|
+
export type OptionValueType<T extends OptionConstructor> = T extends [StringConstructor] ? string[] : T extends [NumberConstructor] ? number[] : T extends StringConstructor ? string : T extends NumberConstructor ? number : T extends ArrayConstructor ? string[] : boolean;
|
|
14
|
+
export type OptionResult<T extends string = string, K extends OptionConstructor = OptionConstructor> = Record<T, OptionValueType<K>>;
|
|
13
15
|
export type OptionReader<T extends OptionResult = OptionResult> = (option: string, read: OptionsReaderRead, options: OptionsReaderState) => T | null;
|
|
14
16
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAA;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C,IAAI,EAAE,CAAC,CAAA;IACP,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAEvE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,IAC7C,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,GACzB,CAAC,CAAC,MAAM,CAAC,GACT,CAAC,CAAA;AAEP,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAExD,MAAM,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAA;AAE5C,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,kBAAkB,CAAA;AAEhH,MAAM,MAAM,eAAe,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAA;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C,IAAI,EAAE,CAAC,CAAA;IACP,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAEvE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,IAC7C,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,GACzB,CAAC,CAAC,MAAM,CAAC,GACT,CAAC,CAAA;AAEP,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAExD,MAAM,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAA;AAE5C,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,kBAAkB,CAAA;AAEhH,MAAM,MAAM,eAAe,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;AAEvE,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,GAAG,eAAe,CAAA;AAEtE,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,iBAAiB,IACrD,CAAC,SAAS,CAAC,iBAAiB,CAAC,GACzB,MAAM,EAAE,GACR,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAC3B,MAAM,EAAE,GACR,CAAC,SAAS,iBAAiB,GACzB,MAAM,GACN,CAAC,SAAS,iBAAiB,GACzB,MAAM,GACN,CAAC,SAAS,gBAAgB,GACxB,MAAM,EAAE,GACR,OAAO,CAAA;AAErB,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,IAAI,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;AAEpI,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAC5D,CACE,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,kBAAkB,KACxB,CAAC,GAAG,IAAI,CAAA"}
|