cli-nano 1.0.2 → 1.1.1
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 +58 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +65 -74
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +51 -3
- package/dist/interfaces.d.ts.map +1 -1
- package/package.json +6 -2
- package/src/index.ts +79 -79
- package/src/interfaces.ts +60 -3
- package/dist/utils.d.ts +0 -7
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -13
- package/dist/utils.js.map +0 -1
- package/src/utils.ts +0 -14
package/README.md
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
[](https://www.npmjs.com/package/cli-nano)
|
|
6
6
|
[](https://www.npmjs.com/package/cli-nano)
|
|
7
7
|
[](https://bundlephobia.com/result?p=cli-nano)
|
|
8
|
+
<a href="https://nodejs.org/en/about/previous-releases"><img src="https://img.shields.io/node/v/cli-nano.svg" alt="Node" /></a>
|
|
8
9
|
|
|
9
10
|
## cli-nano
|
|
10
11
|
|
|
@@ -87,10 +88,13 @@ const config: Config = {
|
|
|
87
88
|
display: {
|
|
88
89
|
alias: 'D',
|
|
89
90
|
required: true,
|
|
91
|
+
type: 'boolean',
|
|
90
92
|
description: 'a required display option',
|
|
91
93
|
}
|
|
92
94
|
},
|
|
93
95
|
version: '0.1.6',
|
|
96
|
+
helpOptLength: 18, // option name length shown in help (defaults to 20)
|
|
97
|
+
helpDescLength: 60, // description length shown in help (defaults to 65)
|
|
94
98
|
};
|
|
95
99
|
|
|
96
100
|
const args = parseArgs(config);
|
|
@@ -100,6 +104,31 @@ console.log(args);
|
|
|
100
104
|
// startServer(args);
|
|
101
105
|
```
|
|
102
106
|
|
|
107
|
+
### Usage with Type Inference
|
|
108
|
+
|
|
109
|
+
For full TypeScript auto-inference and IntelliSense of parsed arguments, define your config as a `const` and use `as const`:
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
const config = {
|
|
113
|
+
... // your config object as shown above
|
|
114
|
+
} as const;
|
|
115
|
+
|
|
116
|
+
const args = parseArgs<typeof config>(config);
|
|
117
|
+
|
|
118
|
+
// TypeScript will infer the correct types:
|
|
119
|
+
args.input; // [string, ...string[]] (required, variadic)
|
|
120
|
+
args.port; // number (optional, has default)
|
|
121
|
+
args.verbose; // boolean (optional)
|
|
122
|
+
args.display; // boolean (required)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
> **Tip:**
|
|
126
|
+
> Using `as const` preserves literal types and tuple information, so TypeScript can infer required/optional fields and argument types automatically.
|
|
127
|
+
> If you use `const config: Config = { ... }`, you get type checking but not full IntelliSense for parsed arguments.
|
|
128
|
+
|
|
129
|
+
> [!NOTE]
|
|
130
|
+
> For required+variadic positionals, the type is `[string, ...string[]]` (at least one value required). For optional variadic, it's string[]. For non-variadic, it's string.
|
|
131
|
+
|
|
103
132
|
#### Example CLI Calls
|
|
104
133
|
|
|
105
134
|
```sh
|
|
@@ -146,4 +175,32 @@ See [examples/](examples/) for more usage patterns.
|
|
|
146
175
|
`cli-nano` is currently used in these other projects of mine (feel free to edit this list):
|
|
147
176
|
|
|
148
177
|
- [native-copyfiles](https://github.com/ghiscoding/native-copyfiles)
|
|
149
|
-
- [remove-glob](https://github.com/ghiscoding/remove-glob)
|
|
178
|
+
- [remove-glob](https://github.com/ghiscoding/remove-glob)
|
|
179
|
+
|
|
180
|
+
## Help Example
|
|
181
|
+
|
|
182
|
+
You can see below an example of a CLI help (which is the result of calling `--help` with the config shown avove).
|
|
183
|
+
|
|
184
|
+
Please note:
|
|
185
|
+
|
|
186
|
+
- `<option>` → required
|
|
187
|
+
- `[option]` → optional
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
Usage:
|
|
191
|
+
serve <input..> [port] [options] Start a server with the given options
|
|
192
|
+
|
|
193
|
+
Arguments:
|
|
194
|
+
input serving files or directory <string..>
|
|
195
|
+
port port to bind on [number]
|
|
196
|
+
|
|
197
|
+
Options:
|
|
198
|
+
-d, --dryRun Show what would be done, but do not actually start the se... [boolean]
|
|
199
|
+
-e, --exclude pattern or glob to exclude (may be passed multiple times) [array]
|
|
200
|
+
-r, --rainbow Enable rainbow mode [boolean]
|
|
201
|
+
-V, --verbose print more information to console [boolean]
|
|
202
|
+
--up slice a path off the bottom of the paths [number]
|
|
203
|
+
-D, --display a required display option <boolean>
|
|
204
|
+
-h, --help Show help [boolean]
|
|
205
|
+
-v, --version Show version number [boolean]
|
|
206
|
+
```
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Config } from './interfaces.js';
|
|
1
|
+
import type { ArgsResult, Config } from './interfaces.js';
|
|
2
2
|
export type * from './interfaces.js';
|
|
3
|
-
export declare function parseArgs(config:
|
|
3
|
+
export declare function parseArgs<C extends Config>(config: C): ArgsResult<C>;
|
|
4
4
|
//# 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,OAAO,KAAK,EAAmB,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE3E,mBAAmB,iBAAiB,CAAC;AAOrC,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAgMpE"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
const defaultOptions = {
|
|
2
|
+
help: { alias: 'h', description: 'Show help', type: 'boolean' },
|
|
3
|
+
version: { alias: 'v', description: 'Show version number', type: 'boolean' },
|
|
4
|
+
};
|
|
2
5
|
export function parseArgs(config) {
|
|
3
6
|
const { command, options, version } = config;
|
|
4
7
|
// Normalize args to support --option=value and -o=value
|
|
@@ -14,11 +17,10 @@ export function parseArgs(config) {
|
|
|
14
17
|
const aliasMap = new Map();
|
|
15
18
|
for (const [key, opt] of Object.entries(options)) {
|
|
16
19
|
if (opt.alias) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
throw new Error(`Duplicate alias detected: "${opt.alias}" used for both "${aliasMap.get(optAlias)}" and "${key}"`);
|
|
20
|
+
if (aliasMap.has(opt.alias)) {
|
|
21
|
+
throw new Error(`Duplicate alias detected: "${opt.alias}" used for both "${aliasMap.get(opt.alias)}" and "${key}"`);
|
|
20
22
|
}
|
|
21
|
-
aliasMap.set(
|
|
23
|
+
aliasMap.set(opt.alias, key);
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
// Handle --help and --version before anything else
|
|
@@ -55,7 +57,7 @@ export function parseArgs(config) {
|
|
|
55
57
|
const remaining = positionals.length - (i + 1);
|
|
56
58
|
const values = nonOptionArgs.slice(nonOptionIndex, nonOptionArgs.length - remaining);
|
|
57
59
|
if (pos.required && values.length === 0) {
|
|
58
|
-
const usagePositionals = positionals
|
|
60
|
+
const usagePositionals = buildUsagePositionals(positionals);
|
|
59
61
|
throw new Error(`Missing required positional argument, i.e.: "${command.name} ${usagePositionals}"`);
|
|
60
62
|
}
|
|
61
63
|
result[pos.name] = !pos.required && values.length === 0 && pos.default !== undefined ? pos.default : values;
|
|
@@ -74,13 +76,12 @@ export function parseArgs(config) {
|
|
|
74
76
|
result[pos.name] = pos.default;
|
|
75
77
|
}
|
|
76
78
|
else if (pos.required) {
|
|
77
|
-
const usagePositionals = positionals
|
|
79
|
+
const usagePositionals = buildUsagePositionals(positionals);
|
|
78
80
|
throw new Error(`Missing required positional argument, i.e.: "${command.name} ${usagePositionals}"`);
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
}
|
|
82
84
|
// Handle options
|
|
83
|
-
// Start parsing options after all non-option args used for positionals
|
|
84
85
|
argIndex = 0;
|
|
85
86
|
const consumedArgs = new Set();
|
|
86
87
|
// Mark all nonOptionArgs indices as consumed for positionals
|
|
@@ -106,52 +107,20 @@ export function parseArgs(config) {
|
|
|
106
107
|
continue;
|
|
107
108
|
}
|
|
108
109
|
const argOrg = args[argIndex] || '';
|
|
109
|
-
let arg =
|
|
110
|
+
let arg = argOrg;
|
|
110
111
|
let option;
|
|
111
112
|
let configKey;
|
|
112
113
|
if (argOrg.startsWith('-')) {
|
|
113
114
|
if (argOrg.startsWith('--')) {
|
|
114
115
|
arg = argOrg.slice(2);
|
|
115
|
-
|
|
116
|
-
option = options[arg] || options[kebabToCamel(arg)] || options[camelToKebab(arg).replace(/-/g, '')];
|
|
117
|
-
if (option) {
|
|
118
|
-
// Find the actual config key
|
|
119
|
-
for (const key of Object.keys(options)) {
|
|
120
|
-
if (options[key] === option) {
|
|
121
|
-
configKey = key;
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
if (!option) {
|
|
127
|
-
// Try matching aliases in all forms
|
|
128
|
-
for (const key of Object.keys(options)) {
|
|
129
|
-
const opt = options[key];
|
|
130
|
-
if (opt.alias && (opt.alias.includes(arg) || opt.alias.includes(kebabToCamel(arg)) || opt.alias.includes(camelToKebab(arg)))) {
|
|
131
|
-
option = opt;
|
|
132
|
-
configKey = key;
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
116
|
+
[option, configKey] = findOption(options, arg);
|
|
137
117
|
}
|
|
138
118
|
else if (argOrg.startsWith('-')) {
|
|
139
|
-
// alias
|
|
140
119
|
arg = argOrg.slice(1);
|
|
141
|
-
|
|
142
|
-
const optionKeys = Object.keys(options);
|
|
143
|
-
for (let j = 0; j < optionKeys.length; j++) {
|
|
144
|
-
const opt = options[optionKeys[j]];
|
|
145
|
-
if (opt.alias && (opt.alias === arg || opt.alias === kebabToCamel(arg) || opt.alias === camelToKebab(arg))) {
|
|
146
|
-
option = opt;
|
|
147
|
-
configKey = optionKeys[j];
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
120
|
+
[option, configKey] = findOption(options, arg);
|
|
152
121
|
}
|
|
122
|
+
// Handle negated boolean in both forms
|
|
153
123
|
if (!option) {
|
|
154
|
-
// Handle negated boolean in both forms
|
|
155
124
|
const isNegated = arg.startsWith('no-');
|
|
156
125
|
const optionName = isNegated ? arg.slice(3) : arg;
|
|
157
126
|
const camelOptionName = kebabToCamel(optionName);
|
|
@@ -219,46 +188,68 @@ export function parseArgs(config) {
|
|
|
219
188
|
});
|
|
220
189
|
return result;
|
|
221
190
|
}
|
|
222
|
-
/**
|
|
223
|
-
function
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
const usagePositionals = (command.positionals ?? [])
|
|
191
|
+
/** Format a text to a fixed length, truncating and padding as needed. */
|
|
192
|
+
function formatHelpText(text, max) {
|
|
193
|
+
const truncated = text.length > max ? `${text.slice(0, max - 3)}...` : text;
|
|
194
|
+
return truncated.padEnd(max);
|
|
195
|
+
}
|
|
196
|
+
/** Build the usage string for positionals, e.g. "<input..> [output]" */
|
|
197
|
+
function buildUsagePositionals(positionals = []) {
|
|
198
|
+
return positionals
|
|
231
199
|
.map(p => {
|
|
232
200
|
const variadic = p.variadic ? '..' : '';
|
|
233
|
-
|
|
234
|
-
return `<${p.name}${variadic}>`;
|
|
235
|
-
}
|
|
236
|
-
return `[${p.name}${variadic}]`;
|
|
201
|
+
return p.required ? `<${p.name}${variadic}>` : `[${p.name}${variadic}]`;
|
|
237
202
|
})
|
|
238
203
|
.join(' ');
|
|
204
|
+
}
|
|
205
|
+
/** Format the option/argument type for help output */
|
|
206
|
+
function formatOptionType(type, variadic, required) {
|
|
207
|
+
const t = type || 'string';
|
|
208
|
+
const variadicStr = variadic ? '..' : '';
|
|
209
|
+
return required ? `<${t}${variadicStr}>` : `[${t}${variadicStr}]`;
|
|
210
|
+
}
|
|
211
|
+
/** Helper to find an option and its config key by argument name or alias. */
|
|
212
|
+
function findOption(options, arg) {
|
|
213
|
+
// Try all forms: as-is, kebab-to-camel, camel-to-kebab
|
|
214
|
+
const option = options[arg] || options[kebabToCamel(arg)] || options[camelToKebab(arg).replace(/-/g, '')];
|
|
215
|
+
if (option) {
|
|
216
|
+
const configKey = Object.keys(options).find(key => options[key] === option);
|
|
217
|
+
return [option, configKey];
|
|
218
|
+
}
|
|
219
|
+
// Try matching alias in all forms
|
|
220
|
+
for (const key of Object.keys(options)) {
|
|
221
|
+
const opt = options[key];
|
|
222
|
+
if (opt.alias && (opt.alias === arg || opt.alias === kebabToCamel(arg) || opt.alias === camelToKebab(arg))) {
|
|
223
|
+
return [opt, key];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return [undefined, undefined];
|
|
227
|
+
}
|
|
228
|
+
/** Print CLI help documentation to the screen */
|
|
229
|
+
function printHelp(config) {
|
|
230
|
+
const { command, options, version, helpOptLength = 20, helpDescLength = 65 } = config;
|
|
231
|
+
const usagePositionals = buildUsagePositionals(command.positionals);
|
|
239
232
|
console.log('Usage:');
|
|
240
233
|
console.log(` ${command.name} ${usagePositionals} [options] ${command.description}`);
|
|
241
|
-
console.log('\
|
|
234
|
+
console.log('\nArguments:');
|
|
242
235
|
command.positionals?.forEach(arg => {
|
|
243
|
-
|
|
244
|
-
desc = desc.padEnd(65); // Always pad to 65 chars for alignment
|
|
245
|
-
console.log(` ${arg.name.padEnd(20)}${desc} [${arg.type || 'string'}]`);
|
|
236
|
+
console.log(` ${formatHelpText(arg.name, helpOptLength)}${formatHelpText(arg.description, helpDescLength)} ${formatOptionType(arg.type, arg.variadic, arg.required)}`);
|
|
246
237
|
});
|
|
247
238
|
console.log('\nOptions:');
|
|
248
|
-
Object.
|
|
249
|
-
const option = options[key];
|
|
250
|
-
const requiredStr = option.required ? '[required]' : '';
|
|
239
|
+
for (const [key, option] of Object.entries({ ...options, ...defaultOptions })) {
|
|
251
240
|
const aliasStr = option.alias ? `-${option.alias}, ` : '';
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
// Print default options (help and version)
|
|
257
|
-
console.log('\nDefault options:');
|
|
258
|
-
console.log(`${padString(' -h, --help', 21)} ${padString('Show help', 65)} [boolean]`);
|
|
259
|
-
if (version) {
|
|
260
|
-
console.log(`${padString(' -v, --version', 21)} ${padString('Show version number', 65)} [boolean]`);
|
|
241
|
+
if (!version && key === 'version') {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
console.log(` ${aliasStr.padEnd(4)}--${formatHelpText(key, helpOptLength - 6)}${formatHelpText(option.description || '', helpDescLength)} ${formatOptionType(option.type, false, option.required)}`);
|
|
261
245
|
}
|
|
262
|
-
|
|
246
|
+
}
|
|
247
|
+
/** Utility to convert kebab-case to camelCase */
|
|
248
|
+
function kebabToCamel(str) {
|
|
249
|
+
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
250
|
+
}
|
|
251
|
+
/** Utility to convert camelCase to kebab-case */
|
|
252
|
+
function camelToKebab(str) {
|
|
253
|
+
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
|
263
254
|
}
|
|
264
255
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAInE,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE7C,wDAAwD;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC/C,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAe,CAAC;YACrC,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,KAAK,oBAAoB,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;YACrH,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,SAAS,CAAC,MAAM,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,sBAAsB,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,gEAAgE;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAClB,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,aAAa,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mEAAmE,GAAG,CAAC,IAAI,yCAAyC,CAAC,CAAC;QACxI,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,OAAO,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnC,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;YACrF,IAAI,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjF,MAAM,IAAI,KAAK,CAAC,gDAAgD,OAAO,CAAC,IAAI,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACvG,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YAC5G,cAAc,IAAI,MAAM,CAAC,MAAM,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;YAC5C,+DAA+D;YAC/D,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YACzE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,GAAG,cAAc,CAAC;YACvD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,GAAG,YAAY,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9F,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBACzB,cAAc,EAAE,CAAC;YACnB,CAAC;iBAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;YACjC,CAAC;iBAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACxB,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjF,MAAM,IAAI,KAAK,CAAC,gDAAgD,OAAO,CAAC,IAAI,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACvG,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,uEAAuE;IACvE,QAAQ,GAAG,CAAC,CAAC;IACb,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,6DAA6D;IAC7D,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;YACzF,KAAK,IAAI,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7E,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvH,CAAC;YACD,kBAAkB,IAAI,MAAM,CAAC,MAAM,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAClD,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,QAAQ,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,IAAI,MAAmC,CAAC;QACxC,IAAI,SAA6B,CAAC;QAElC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,uDAAuD;gBACvD,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBACpG,IAAI,MAAM,EAAE,CAAC;oBACX,6BAA6B;oBAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBACvC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC;4BAC5B,SAAS,GAAG,GAAG,CAAC;4BAChB,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,oCAAoC;oBACpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;wBACzB,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;4BAC7H,MAAM,GAAG,GAAG,CAAC;4BACb,SAAS,GAAG,GAAG,CAAC;4BAChB,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,QAAQ;gBACR,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnC,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;4BAC3G,MAAM,GAAG,GAAG,CAAC;4BACb,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;4BAC1B,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,uCAAuC;gBACvC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACxC,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAClD,MAAM,eAAe,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;gBACjD,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;gBACzD,SAAS,GAAG,eAAe,IAAI,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;gBACtE,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,CAAC,KAAK,SAAS,EAAE,CAAC;wBAC9E,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;oBAChF,CAAC;oBACD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;oBAC/B,QAAQ,EAAE,CAAC;oBACX,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,KAAK,SAAS;oBACZ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;wBACpC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;oBAChF,CAAC;oBACD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC9E,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC3E,MAAM,IAAI,KAAK,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;oBAC5D,CAAC;oBACD,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAC7C,MAAM;gBACR,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;wBAAE,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;oBAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;oBACpC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC3D,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;oBAClE,CAAC;oBACD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACnC,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC;gBACd;oBACE,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC3E,MAAM,IAAI,KAAK,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;oBAC5D,CAAC;oBACD,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;oBACrC,MAAM;YACV,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,qEAAqE;IACrE,mDAAmD;IACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;QAC7C,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iDAAiD;AACjD,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE7C,mCAAmC;IACnC,SAAS,YAAY,CAAC,IAAY,EAAE,GAAW;QAC7C,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;IAED,qCAAqC;IACrC,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC;IAClC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,gBAAgB,eAAe,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;QACjC,IAAI,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,uCAAuC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,uCAAuC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAC;IAC9G,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAC3C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;IACxF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,qBAAqB,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;IACvG,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/interfaces.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ export interface ArgumentOptions {
|
|
|
3
3
|
type?: 'string' | 'boolean' | 'number' | 'array';
|
|
4
4
|
/** description of the flag option */
|
|
5
5
|
description: string;
|
|
6
|
-
/** defaults to undefined, provide shorter
|
|
7
|
-
alias?: string
|
|
6
|
+
/** defaults to undefined, provide shorter alias as command options */
|
|
7
|
+
alias?: string;
|
|
8
8
|
/** default value for the option if not provided */
|
|
9
9
|
default?: any;
|
|
10
10
|
/** defaults to false, is the option required? */
|
|
@@ -30,15 +30,63 @@ export interface CommandOptions {
|
|
|
30
30
|
/** command description */
|
|
31
31
|
description: string;
|
|
32
32
|
/** list of positional arguments */
|
|
33
|
-
positionals?: PositionalArgument[];
|
|
33
|
+
positionals?: readonly PositionalArgument[];
|
|
34
34
|
}
|
|
35
35
|
/** CLI options */
|
|
36
36
|
export interface Config {
|
|
37
37
|
/** CLI definition */
|
|
38
38
|
command: CommandOptions;
|
|
39
|
+
/** option name length (w/wo alias) shown in the help (defaults to 20) */
|
|
40
|
+
helpOptLength?: number;
|
|
41
|
+
/** description length shown in the help (defaults to 65) */
|
|
42
|
+
helpDescLength?: number;
|
|
39
43
|
/** CLI list of flag options */
|
|
40
44
|
options: Record<string, ArgumentOptions>;
|
|
41
45
|
/** CLI or package version */
|
|
42
46
|
version?: string;
|
|
43
47
|
}
|
|
48
|
+
/** Utility type to map ArgumentOptions/PositionalArgument to their value type */
|
|
49
|
+
export type ArgValueType<T extends {
|
|
50
|
+
type?: string;
|
|
51
|
+
default?: any;
|
|
52
|
+
variadic?: boolean;
|
|
53
|
+
required?: boolean;
|
|
54
|
+
}> = T['type'] extends 'boolean' ? boolean : T['type'] extends 'number' ? number : T['type'] extends 'array' ? T extends {
|
|
55
|
+
variadic: true;
|
|
56
|
+
} ? T extends {
|
|
57
|
+
required: true;
|
|
58
|
+
} ? [string, ...string[]] : string[] : string | string[] : T['type'] extends 'string' ? T extends {
|
|
59
|
+
variadic: true;
|
|
60
|
+
} ? T extends {
|
|
61
|
+
required: true;
|
|
62
|
+
} ? [string, ...string[]] : string[] : string : T['type'] extends undefined ? T extends {
|
|
63
|
+
variadic: true;
|
|
64
|
+
} ? T extends {
|
|
65
|
+
required: true;
|
|
66
|
+
} ? [string, ...string[]] : string[] : string : T['default'] extends undefined ? string : T['default'];
|
|
67
|
+
/** Helper to get required keys */
|
|
68
|
+
type RequiredKeys<T> = {
|
|
69
|
+
[K in keyof T]: T[K] extends {
|
|
70
|
+
required: true;
|
|
71
|
+
} ? K : never;
|
|
72
|
+
}[keyof T];
|
|
73
|
+
/** Helper to get optional keys */
|
|
74
|
+
type OptionalKeys<T> = Exclude<keyof T, RequiredKeys<T>>;
|
|
75
|
+
/** Map options record to an object type with required/optional properties */
|
|
76
|
+
export type OptionsToObject<T extends Record<string, any>> = {
|
|
77
|
+
[K in RequiredKeys<T>]: ArgValueType<T[K]>;
|
|
78
|
+
} & {
|
|
79
|
+
[K in OptionalKeys<T>]?: ArgValueType<T[K]>;
|
|
80
|
+
};
|
|
81
|
+
/** Map positionals array to an object type with required/optional properties */
|
|
82
|
+
export type PositionalsToObject<T extends readonly PositionalArgument[] | undefined> = T extends readonly [infer P, ...infer Rest] ? P extends PositionalArgument ? (P['required'] extends true ? {
|
|
83
|
+
[K in P['name']]: ArgValueType<P>;
|
|
84
|
+
} : {
|
|
85
|
+
[K in P['name']]?: ArgValueType<P>;
|
|
86
|
+
}) & PositionalsToObject<Rest extends readonly PositionalArgument[] ? Rest : []> : PositionalsToObject<Rest extends readonly PositionalArgument[] ? Rest : []> : {
|
|
87
|
+
[key: string]: never;
|
|
88
|
+
};
|
|
89
|
+
/** The full result type for parseArgs */
|
|
90
|
+
export type ArgsResult<C extends Config> = PositionalsToObject<C['command']['positionals']> & OptionsToObject<C['options']>;
|
|
91
|
+
export {};
|
|
44
92
|
//# sourceMappingURL=interfaces.d.ts.map
|
package/dist/interfaces.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,kBAAkB;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAEjD,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IAEpB,
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cli-nano",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Mini command-line tool similar to `yargs` or `parseArgs` from Node.js that accepts positional arguments, flags and options.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -30,6 +30,10 @@
|
|
|
30
30
|
"url": "https://github.com/ghiscoding/cli-nano/issues"
|
|
31
31
|
},
|
|
32
32
|
"engines": {
|
|
33
|
-
"node": "
|
|
33
|
+
"node": "^20.0.0 || >=22.0.0"
|
|
34
|
+
},
|
|
35
|
+
"funding": {
|
|
36
|
+
"type": "ko_fi",
|
|
37
|
+
"url": "https://ko-fi.com/ghiscoding"
|
|
34
38
|
}
|
|
35
39
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import type { ArgumentOptions, Config } from './interfaces.js';
|
|
2
|
-
import { camelToKebab, kebabToCamel, padString } from './utils.js';
|
|
1
|
+
import type { ArgsResult, ArgumentOptions, Config } from './interfaces.js';
|
|
3
2
|
|
|
4
3
|
export type * from './interfaces.js';
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
const defaultOptions: Record<string, ArgumentOptions> = {
|
|
6
|
+
help: { alias: 'h', description: 'Show help', type: 'boolean' },
|
|
7
|
+
version: { alias: 'v', description: 'Show version number', type: 'boolean' },
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export function parseArgs<C extends Config>(config: C): ArgsResult<C> {
|
|
7
11
|
const { command, options, version } = config;
|
|
8
12
|
|
|
9
13
|
// Normalize args to support --option=value and -o=value
|
|
@@ -20,11 +24,10 @@ export function parseArgs(config: Config): Record<string, any> {
|
|
|
20
24
|
const aliasMap = new Map<string, string>();
|
|
21
25
|
for (const [key, opt] of Object.entries(options)) {
|
|
22
26
|
if (opt.alias) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
throw new Error(`Duplicate alias detected: "${opt.alias}" used for both "${aliasMap.get(optAlias)}" and "${key}"`);
|
|
27
|
+
if (aliasMap.has(opt.alias)) {
|
|
28
|
+
throw new Error(`Duplicate alias detected: "${opt.alias}" used for both "${aliasMap.get(opt.alias)}" and "${key}"`);
|
|
26
29
|
}
|
|
27
|
-
aliasMap.set(
|
|
30
|
+
aliasMap.set(opt.alias, key);
|
|
28
31
|
}
|
|
29
32
|
}
|
|
30
33
|
|
|
@@ -65,7 +68,7 @@ export function parseArgs(config: Config): Record<string, any> {
|
|
|
65
68
|
const remaining = positionals.length - (i + 1);
|
|
66
69
|
const values = nonOptionArgs.slice(nonOptionIndex, nonOptionArgs.length - remaining);
|
|
67
70
|
if (pos.required && values.length === 0) {
|
|
68
|
-
const usagePositionals = positionals
|
|
71
|
+
const usagePositionals = buildUsagePositionals(positionals);
|
|
69
72
|
throw new Error(`Missing required positional argument, i.e.: "${command.name} ${usagePositionals}"`);
|
|
70
73
|
}
|
|
71
74
|
result[pos.name] = !pos.required && values.length === 0 && pos.default !== undefined ? pos.default : values;
|
|
@@ -81,14 +84,13 @@ export function parseArgs(config: Config): Record<string, any> {
|
|
|
81
84
|
} else if (!pos.required && pos.default !== undefined) {
|
|
82
85
|
result[pos.name] = pos.default;
|
|
83
86
|
} else if (pos.required) {
|
|
84
|
-
const usagePositionals = positionals
|
|
87
|
+
const usagePositionals = buildUsagePositionals(positionals);
|
|
85
88
|
throw new Error(`Missing required positional argument, i.e.: "${command.name} ${usagePositionals}"`);
|
|
86
89
|
}
|
|
87
90
|
}
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
// Handle options
|
|
91
|
-
// Start parsing options after all non-option args used for positionals
|
|
92
94
|
argIndex = 0;
|
|
93
95
|
const consumedArgs = new Set<number>();
|
|
94
96
|
// Mark all nonOptionArgs indices as consumed for positionals
|
|
@@ -114,53 +116,21 @@ export function parseArgs(config: Config): Record<string, any> {
|
|
|
114
116
|
continue;
|
|
115
117
|
}
|
|
116
118
|
const argOrg = args[argIndex] || '';
|
|
117
|
-
let arg =
|
|
119
|
+
let arg = argOrg;
|
|
118
120
|
let option: ArgumentOptions | undefined;
|
|
119
121
|
let configKey: string | undefined;
|
|
120
122
|
|
|
121
123
|
if (argOrg.startsWith('-')) {
|
|
122
124
|
if (argOrg.startsWith('--')) {
|
|
123
125
|
arg = argOrg.slice(2);
|
|
124
|
-
|
|
125
|
-
option = options[arg] || options[kebabToCamel(arg)] || options[camelToKebab(arg).replace(/-/g, '')];
|
|
126
|
-
if (option) {
|
|
127
|
-
// Find the actual config key
|
|
128
|
-
for (const key of Object.keys(options)) {
|
|
129
|
-
if (options[key] === option) {
|
|
130
|
-
configKey = key;
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
if (!option) {
|
|
136
|
-
// Try matching aliases in all forms
|
|
137
|
-
for (const key of Object.keys(options)) {
|
|
138
|
-
const opt = options[key];
|
|
139
|
-
if (opt.alias && (opt.alias.includes(arg) || opt.alias.includes(kebabToCamel(arg)) || opt.alias.includes(camelToKebab(arg)))) {
|
|
140
|
-
option = opt;
|
|
141
|
-
configKey = key;
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
126
|
+
[option, configKey] = findOption(options, arg);
|
|
146
127
|
} else if (argOrg.startsWith('-')) {
|
|
147
|
-
// alias
|
|
148
128
|
arg = argOrg.slice(1);
|
|
149
|
-
|
|
150
|
-
const optionKeys = Object.keys(options);
|
|
151
|
-
for (let j = 0; j < optionKeys.length; j++) {
|
|
152
|
-
const opt = options[optionKeys[j]];
|
|
153
|
-
if (opt.alias && (opt.alias === arg || opt.alias === kebabToCamel(arg) || opt.alias === camelToKebab(arg))) {
|
|
154
|
-
option = opt;
|
|
155
|
-
configKey = optionKeys[j];
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
129
|
+
[option, configKey] = findOption(options, arg);
|
|
160
130
|
}
|
|
161
131
|
|
|
132
|
+
// Handle negated boolean in both forms
|
|
162
133
|
if (!option) {
|
|
163
|
-
// Handle negated boolean in both forms
|
|
164
134
|
const isNegated = arg.startsWith('no-');
|
|
165
135
|
const optionName = isNegated ? arg.slice(3) : arg;
|
|
166
136
|
const camelOptionName = kebabToCamel(optionName);
|
|
@@ -228,52 +198,82 @@ export function parseArgs(config: Config): Record<string, any> {
|
|
|
228
198
|
}
|
|
229
199
|
});
|
|
230
200
|
|
|
231
|
-
return result
|
|
201
|
+
return result as ArgsResult<C>;
|
|
232
202
|
}
|
|
233
203
|
|
|
234
|
-
/**
|
|
235
|
-
function
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
function truncateDesc(desc: string, max: number) {
|
|
240
|
-
return desc.length > max ? `${desc.slice(0, max - 3)}...` : desc;
|
|
241
|
-
}
|
|
204
|
+
/** Format a text to a fixed length, truncating and padding as needed. */
|
|
205
|
+
function formatHelpText(text: string, max: number) {
|
|
206
|
+
const truncated = text.length > max ? `${text.slice(0, max - 3)}...` : text;
|
|
207
|
+
return truncated.padEnd(max);
|
|
208
|
+
}
|
|
242
209
|
|
|
243
|
-
|
|
244
|
-
|
|
210
|
+
/** Build the usage string for positionals, e.g. "<input..> [output]" */
|
|
211
|
+
function buildUsagePositionals(positionals: readonly any[] = []) {
|
|
212
|
+
return positionals
|
|
245
213
|
.map(p => {
|
|
246
214
|
const variadic = p.variadic ? '..' : '';
|
|
247
|
-
|
|
248
|
-
return `<${p.name}${variadic}>`;
|
|
249
|
-
}
|
|
250
|
-
return `[${p.name}${variadic}]`;
|
|
215
|
+
return p.required ? `<${p.name}${variadic}>` : `[${p.name}${variadic}]`;
|
|
251
216
|
})
|
|
252
217
|
.join(' ');
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Format the option/argument type for help output */
|
|
221
|
+
function formatOptionType(type: string | undefined, variadic?: boolean, required?: boolean) {
|
|
222
|
+
const t = type || 'string';
|
|
223
|
+
const variadicStr = variadic ? '..' : '';
|
|
224
|
+
return required ? `<${t}${variadicStr}>` : `[${t}${variadicStr}]`;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Helper to find an option and its config key by argument name or alias. */
|
|
228
|
+
function findOption(options: Record<string, ArgumentOptions>, arg: string): [ArgumentOptions | undefined, string | undefined] {
|
|
229
|
+
// Try all forms: as-is, kebab-to-camel, camel-to-kebab
|
|
230
|
+
const option = options[arg] || options[kebabToCamel(arg)] || options[camelToKebab(arg).replace(/-/g, '')];
|
|
231
|
+
if (option) {
|
|
232
|
+
const configKey = Object.keys(options).find(key => options[key] === option);
|
|
233
|
+
return [option, configKey];
|
|
234
|
+
}
|
|
235
|
+
// Try matching alias in all forms
|
|
236
|
+
for (const key of Object.keys(options)) {
|
|
237
|
+
const opt = options[key];
|
|
238
|
+
if (opt.alias && (opt.alias === arg || opt.alias === kebabToCamel(arg) || opt.alias === camelToKebab(arg))) {
|
|
239
|
+
return [opt, key];
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return [undefined, undefined];
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** Print CLI help documentation to the screen */
|
|
246
|
+
function printHelp(config: Config) {
|
|
247
|
+
const { command, options, version, helpOptLength = 20, helpDescLength = 65 } = config;
|
|
248
|
+
const usagePositionals = buildUsagePositionals(command.positionals);
|
|
249
|
+
|
|
253
250
|
console.log('Usage:');
|
|
254
251
|
console.log(` ${command.name} ${usagePositionals} [options] ${command.description}`);
|
|
255
|
-
console.log('\
|
|
252
|
+
console.log('\nArguments:');
|
|
256
253
|
command.positionals?.forEach(arg => {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
254
|
+
console.log(
|
|
255
|
+
` ${formatHelpText(arg.name, helpOptLength)}${formatHelpText(arg.description, helpDescLength)} ${formatOptionType(arg.type, arg.variadic, arg.required)}`,
|
|
256
|
+
);
|
|
260
257
|
});
|
|
261
258
|
|
|
262
259
|
console.log('\nOptions:');
|
|
263
|
-
Object.
|
|
264
|
-
const option = options[key];
|
|
265
|
-
const requiredStr = option.required ? '[required]' : '';
|
|
260
|
+
for (const [key, option] of Object.entries({ ...options, ...defaultOptions })) {
|
|
266
261
|
const aliasStr = option.alias ? `-${option.alias}, ` : '';
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
console.log('\nDefault options:');
|
|
274
|
-
console.log(`${padString(' -h, --help', 21)} ${padString('Show help', 65)} [boolean]`);
|
|
275
|
-
if (version) {
|
|
276
|
-
console.log(`${padString(' -v, --version', 21)} ${padString('Show version number', 65)} [boolean]`);
|
|
262
|
+
if (!version && key === 'version') {
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
console.log(
|
|
266
|
+
` ${aliasStr.padEnd(4)}--${formatHelpText(key, helpOptLength - 6)}${formatHelpText(option.description || '', helpDescLength)} ${formatOptionType(option.type, false, option.required)}`,
|
|
267
|
+
);
|
|
277
268
|
}
|
|
278
|
-
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** Utility to convert kebab-case to camelCase */
|
|
272
|
+
function kebabToCamel(str: string) {
|
|
273
|
+
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Utility to convert camelCase to kebab-case */
|
|
277
|
+
function camelToKebab(str: string) {
|
|
278
|
+
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
|
279
279
|
}
|
package/src/interfaces.ts
CHANGED
|
@@ -5,8 +5,8 @@ export interface ArgumentOptions {
|
|
|
5
5
|
/** description of the flag option */
|
|
6
6
|
description: string;
|
|
7
7
|
|
|
8
|
-
/** defaults to undefined, provide shorter
|
|
9
|
-
alias?: string
|
|
8
|
+
/** defaults to undefined, provide shorter alias as command options */
|
|
9
|
+
alias?: string;
|
|
10
10
|
|
|
11
11
|
/** default value for the option if not provided */
|
|
12
12
|
default?: any;
|
|
@@ -43,7 +43,7 @@ export interface CommandOptions {
|
|
|
43
43
|
description: string;
|
|
44
44
|
|
|
45
45
|
/** list of positional arguments */
|
|
46
|
-
positionals?: PositionalArgument[];
|
|
46
|
+
positionals?: readonly PositionalArgument[];
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/** CLI options */
|
|
@@ -51,9 +51,66 @@ export interface Config {
|
|
|
51
51
|
/** CLI definition */
|
|
52
52
|
command: CommandOptions;
|
|
53
53
|
|
|
54
|
+
/** option name length (w/wo alias) shown in the help (defaults to 20) */
|
|
55
|
+
helpOptLength?: number;
|
|
56
|
+
|
|
57
|
+
/** description length shown in the help (defaults to 65) */
|
|
58
|
+
helpDescLength?: number;
|
|
59
|
+
|
|
54
60
|
/** CLI list of flag options */
|
|
55
61
|
options: Record<string, ArgumentOptions>;
|
|
56
62
|
|
|
57
63
|
/** CLI or package version */
|
|
58
64
|
version?: string;
|
|
59
65
|
}
|
|
66
|
+
|
|
67
|
+
/** Utility type to map ArgumentOptions/PositionalArgument to their value type */
|
|
68
|
+
export type ArgValueType<T extends { type?: string; default?: any; variadic?: boolean; required?: boolean }> = T['type'] extends 'boolean'
|
|
69
|
+
? boolean
|
|
70
|
+
: T['type'] extends 'number'
|
|
71
|
+
? number
|
|
72
|
+
: T['type'] extends 'array'
|
|
73
|
+
? T extends { variadic: true }
|
|
74
|
+
? T extends { required: true }
|
|
75
|
+
? [string, ...string[]]
|
|
76
|
+
: string[]
|
|
77
|
+
: string | string[]
|
|
78
|
+
: T['type'] extends 'string'
|
|
79
|
+
? T extends { variadic: true }
|
|
80
|
+
? T extends { required: true }
|
|
81
|
+
? [string, ...string[]]
|
|
82
|
+
: string[]
|
|
83
|
+
: string
|
|
84
|
+
: T['type'] extends undefined
|
|
85
|
+
? T extends { variadic: true }
|
|
86
|
+
? T extends { required: true }
|
|
87
|
+
? [string, ...string[]]
|
|
88
|
+
: string[]
|
|
89
|
+
: string
|
|
90
|
+
: T['default'] extends undefined
|
|
91
|
+
? string
|
|
92
|
+
: T['default'];
|
|
93
|
+
|
|
94
|
+
/** Helper to get required keys */
|
|
95
|
+
type RequiredKeys<T> = {
|
|
96
|
+
[K in keyof T]: T[K] extends { required: true } ? K : never;
|
|
97
|
+
}[keyof T];
|
|
98
|
+
|
|
99
|
+
/** Helper to get optional keys */
|
|
100
|
+
type OptionalKeys<T> = Exclude<keyof T, RequiredKeys<T>>;
|
|
101
|
+
|
|
102
|
+
/** Map options record to an object type with required/optional properties */
|
|
103
|
+
export type OptionsToObject<T extends Record<string, any>> = { [K in RequiredKeys<T>]: ArgValueType<T[K]> } & {
|
|
104
|
+
[K in OptionalKeys<T>]?: ArgValueType<T[K]>;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/** Map positionals array to an object type with required/optional properties */
|
|
108
|
+
export type PositionalsToObject<T extends readonly PositionalArgument[] | undefined> = T extends readonly [infer P, ...infer Rest]
|
|
109
|
+
? P extends PositionalArgument
|
|
110
|
+
? (P['required'] extends true ? { [K in P['name']]: ArgValueType<P> } : { [K in P['name']]?: ArgValueType<P> }) &
|
|
111
|
+
PositionalsToObject<Rest extends readonly PositionalArgument[] ? Rest : []>
|
|
112
|
+
: PositionalsToObject<Rest extends readonly PositionalArgument[] ? Rest : []>
|
|
113
|
+
: { [key: string]: never };
|
|
114
|
+
|
|
115
|
+
/** The full result type for parseArgs */
|
|
116
|
+
export type ArgsResult<C extends Config> = PositionalsToObject<C['command']['positionals']> & OptionsToObject<C['options']>;
|
package/dist/utils.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/** Utility to convert kebab-case to camelCase */
|
|
2
|
-
export declare function kebabToCamel(str: string): string;
|
|
3
|
-
/** Utility to convert camelCase to kebab-case */
|
|
4
|
-
export declare function camelToKebab(str: string): string;
|
|
5
|
-
/** add whitespace padding to any input string */
|
|
6
|
-
export declare function padString(input: string, padding: number): string;
|
|
7
|
-
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,UAEvC;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,UAEvC;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAEvD"}
|
package/dist/utils.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/** Utility to convert kebab-case to camelCase */
|
|
2
|
-
export function kebabToCamel(str) {
|
|
3
|
-
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
4
|
-
}
|
|
5
|
-
/** Utility to convert camelCase to kebab-case */
|
|
6
|
-
export function camelToKebab(str) {
|
|
7
|
-
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
|
8
|
-
}
|
|
9
|
-
/** add whitespace padding to any input string */
|
|
10
|
-
export function padString(input, padding) {
|
|
11
|
-
return input.padEnd(padding);
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAClE,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,OAAe;IACtD,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC"}
|
package/src/utils.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/** Utility to convert kebab-case to camelCase */
|
|
2
|
-
export function kebabToCamel(str: string) {
|
|
3
|
-
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
/** Utility to convert camelCase to kebab-case */
|
|
7
|
-
export function camelToKebab(str: string) {
|
|
8
|
-
return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/** add whitespace padding to any input string */
|
|
12
|
-
export function padString(input: string, padding: number) {
|
|
13
|
-
return input.padEnd(padding);
|
|
14
|
-
}
|