citty 0.0.2 → 0.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/dist/index.cjs +77 -8
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +73 -5
- package/package.json +7 -9
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const scule = require('scule');
|
|
4
3
|
const tty = require('tty');
|
|
5
4
|
|
|
6
|
-
function
|
|
5
|
+
function _interopNamespaceCompat(e) {
|
|
6
|
+
if (e && typeof e === 'object' && 'default' in e) return e;
|
|
7
7
|
const n = Object.create(null);
|
|
8
8
|
if (e) {
|
|
9
9
|
for (const k in e) {
|
|
@@ -14,7 +14,7 @@ function _interopNamespaceDefault(e) {
|
|
|
14
14
|
return n;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
const tty__namespace = /*#__PURE__*/
|
|
17
|
+
const tty__namespace = /*#__PURE__*/_interopNamespaceCompat(tty);
|
|
18
18
|
|
|
19
19
|
function toArray(val) {
|
|
20
20
|
if (Array.isArray(val)) {
|
|
@@ -46,6 +46,70 @@ class CLIError extends Error {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
const NUMBER_CHAR_RE = /\d/;
|
|
50
|
+
const STR_SPLITTERS = ["-", "_", "/", "."];
|
|
51
|
+
function isUppercase(char = "") {
|
|
52
|
+
if (NUMBER_CHAR_RE.test(char)) {
|
|
53
|
+
return void 0;
|
|
54
|
+
}
|
|
55
|
+
return char.toUpperCase() === char;
|
|
56
|
+
}
|
|
57
|
+
function splitByCase(string_, separators) {
|
|
58
|
+
const splitters = separators ?? STR_SPLITTERS;
|
|
59
|
+
const parts = [];
|
|
60
|
+
if (!string_ || typeof string_ !== "string") {
|
|
61
|
+
return parts;
|
|
62
|
+
}
|
|
63
|
+
let buff = "";
|
|
64
|
+
let previousUpper;
|
|
65
|
+
let previousSplitter;
|
|
66
|
+
for (const char of string_) {
|
|
67
|
+
const isSplitter = splitters.includes(char);
|
|
68
|
+
if (isSplitter === true) {
|
|
69
|
+
parts.push(buff);
|
|
70
|
+
buff = "";
|
|
71
|
+
previousUpper = void 0;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const isUpper = isUppercase(char);
|
|
75
|
+
if (previousSplitter === false) {
|
|
76
|
+
if (previousUpper === false && isUpper === true) {
|
|
77
|
+
parts.push(buff);
|
|
78
|
+
buff = char;
|
|
79
|
+
previousUpper = isUpper;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (previousUpper === true && isUpper === false && buff.length > 1) {
|
|
83
|
+
const lastChar = buff[buff.length - 1];
|
|
84
|
+
parts.push(buff.slice(0, Math.max(0, buff.length - 1)));
|
|
85
|
+
buff = lastChar + char;
|
|
86
|
+
previousUpper = isUpper;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
buff += char;
|
|
91
|
+
previousUpper = isUpper;
|
|
92
|
+
previousSplitter = isSplitter;
|
|
93
|
+
}
|
|
94
|
+
parts.push(buff);
|
|
95
|
+
return parts;
|
|
96
|
+
}
|
|
97
|
+
function upperFirst(string_) {
|
|
98
|
+
return !string_ ? "" : string_[0].toUpperCase() + string_.slice(1);
|
|
99
|
+
}
|
|
100
|
+
function lowerFirst(string_) {
|
|
101
|
+
return !string_ ? "" : string_[0].toLowerCase() + string_.slice(1);
|
|
102
|
+
}
|
|
103
|
+
function pascalCase(string_) {
|
|
104
|
+
return !string_ ? "" : (Array.isArray(string_) ? string_ : splitByCase(string_)).map((p) => upperFirst(p)).join("");
|
|
105
|
+
}
|
|
106
|
+
function camelCase(string_) {
|
|
107
|
+
return lowerFirst(pascalCase(string_));
|
|
108
|
+
}
|
|
109
|
+
function kebabCase(string_, joiner) {
|
|
110
|
+
return !string_ ? "" : (Array.isArray(string_) ? string_ : splitByCase(string_)).map((p) => p.toLowerCase()).join(joiner ?? "-");
|
|
111
|
+
}
|
|
112
|
+
|
|
49
113
|
function toArr(any) {
|
|
50
114
|
return any == void 0 ? [] : Array.isArray(any) ? any : [any];
|
|
51
115
|
}
|
|
@@ -164,6 +228,7 @@ function parseArgs(rawArgs, argsDef) {
|
|
|
164
228
|
const parseOptions = {
|
|
165
229
|
boolean: [],
|
|
166
230
|
string: [],
|
|
231
|
+
mixed: [],
|
|
167
232
|
alias: {},
|
|
168
233
|
default: {}
|
|
169
234
|
};
|
|
@@ -172,7 +237,11 @@ function parseArgs(rawArgs, argsDef) {
|
|
|
172
237
|
if (arg.type === "positional") {
|
|
173
238
|
continue;
|
|
174
239
|
}
|
|
175
|
-
|
|
240
|
+
if (arg.type === "string") {
|
|
241
|
+
parseOptions.string.push(arg.name);
|
|
242
|
+
} else if (arg.type === "boolean") {
|
|
243
|
+
parseOptions.boolean.push(arg.name);
|
|
244
|
+
}
|
|
176
245
|
if (arg.default !== void 0) {
|
|
177
246
|
parseOptions.default[arg.name] = arg.default;
|
|
178
247
|
}
|
|
@@ -181,10 +250,10 @@ function parseArgs(rawArgs, argsDef) {
|
|
|
181
250
|
}
|
|
182
251
|
}
|
|
183
252
|
const parsed = parseRawArgs(rawArgs, parseOptions);
|
|
184
|
-
const [
|
|
253
|
+
const [...positionalArguments] = parsed._;
|
|
185
254
|
const parsedArgsProxy = new Proxy(parsed, {
|
|
186
255
|
get(target, prop) {
|
|
187
|
-
return target[prop] ?? target[
|
|
256
|
+
return target[prop] ?? target[camelCase(prop)] ?? target[kebabCase(prop)];
|
|
188
257
|
}
|
|
189
258
|
});
|
|
190
259
|
for (const [, arg] of args.entries()) {
|
|
@@ -253,7 +322,7 @@ async function runCommand(cmd, opts) {
|
|
|
253
322
|
const subCommand = await resolveValue(subCommands[subCommandName]);
|
|
254
323
|
if (subCommand) {
|
|
255
324
|
await runCommand(subCommand, {
|
|
256
|
-
rawArgs: opts.rawArgs.slice(subCommandArgIndex)
|
|
325
|
+
rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1)
|
|
257
326
|
});
|
|
258
327
|
}
|
|
259
328
|
}
|
|
@@ -270,7 +339,7 @@ async function resolveSubCommand(cmd, rawArgs, parent) {
|
|
|
270
339
|
if (subCommand) {
|
|
271
340
|
return resolveSubCommand(
|
|
272
341
|
subCommand,
|
|
273
|
-
rawArgs.slice(subCommandArgIndex),
|
|
342
|
+
rawArgs.slice(subCommandArgIndex + 1),
|
|
274
343
|
cmd
|
|
275
344
|
);
|
|
276
345
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ type ParsedArgs<T extends ArgsDef = ArgsDef> = {
|
|
|
22
22
|
[K in keyof T]: T[K] extends {
|
|
23
23
|
type: "positional";
|
|
24
24
|
} ? K : never;
|
|
25
|
-
}[keyof T], string
|
|
25
|
+
}[keyof T], string> & Record<{
|
|
26
26
|
[K in keyof T]: T[K] extends {
|
|
27
27
|
type: "string";
|
|
28
28
|
} ? K : never;
|
|
@@ -30,7 +30,7 @@ type ParsedArgs<T extends ArgsDef = ArgsDef> = {
|
|
|
30
30
|
[K in keyof T]: T[K] extends {
|
|
31
31
|
type: "boolean";
|
|
32
32
|
} ? K : never;
|
|
33
|
-
}[keyof T], boolean>;
|
|
33
|
+
}[keyof T], boolean> & Record<string, string | boolean>;
|
|
34
34
|
interface CommandMeta {
|
|
35
35
|
name?: string;
|
|
36
36
|
version?: string;
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { camelCase, kebabCase } from 'scule';
|
|
2
1
|
import * as tty from 'tty';
|
|
3
2
|
|
|
4
3
|
function toArray(val) {
|
|
@@ -31,6 +30,70 @@ class CLIError extends Error {
|
|
|
31
30
|
}
|
|
32
31
|
}
|
|
33
32
|
|
|
33
|
+
const NUMBER_CHAR_RE = /\d/;
|
|
34
|
+
const STR_SPLITTERS = ["-", "_", "/", "."];
|
|
35
|
+
function isUppercase(char = "") {
|
|
36
|
+
if (NUMBER_CHAR_RE.test(char)) {
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
return char.toUpperCase() === char;
|
|
40
|
+
}
|
|
41
|
+
function splitByCase(string_, separators) {
|
|
42
|
+
const splitters = separators ?? STR_SPLITTERS;
|
|
43
|
+
const parts = [];
|
|
44
|
+
if (!string_ || typeof string_ !== "string") {
|
|
45
|
+
return parts;
|
|
46
|
+
}
|
|
47
|
+
let buff = "";
|
|
48
|
+
let previousUpper;
|
|
49
|
+
let previousSplitter;
|
|
50
|
+
for (const char of string_) {
|
|
51
|
+
const isSplitter = splitters.includes(char);
|
|
52
|
+
if (isSplitter === true) {
|
|
53
|
+
parts.push(buff);
|
|
54
|
+
buff = "";
|
|
55
|
+
previousUpper = void 0;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const isUpper = isUppercase(char);
|
|
59
|
+
if (previousSplitter === false) {
|
|
60
|
+
if (previousUpper === false && isUpper === true) {
|
|
61
|
+
parts.push(buff);
|
|
62
|
+
buff = char;
|
|
63
|
+
previousUpper = isUpper;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (previousUpper === true && isUpper === false && buff.length > 1) {
|
|
67
|
+
const lastChar = buff[buff.length - 1];
|
|
68
|
+
parts.push(buff.slice(0, Math.max(0, buff.length - 1)));
|
|
69
|
+
buff = lastChar + char;
|
|
70
|
+
previousUpper = isUpper;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
buff += char;
|
|
75
|
+
previousUpper = isUpper;
|
|
76
|
+
previousSplitter = isSplitter;
|
|
77
|
+
}
|
|
78
|
+
parts.push(buff);
|
|
79
|
+
return parts;
|
|
80
|
+
}
|
|
81
|
+
function upperFirst(string_) {
|
|
82
|
+
return !string_ ? "" : string_[0].toUpperCase() + string_.slice(1);
|
|
83
|
+
}
|
|
84
|
+
function lowerFirst(string_) {
|
|
85
|
+
return !string_ ? "" : string_[0].toLowerCase() + string_.slice(1);
|
|
86
|
+
}
|
|
87
|
+
function pascalCase(string_) {
|
|
88
|
+
return !string_ ? "" : (Array.isArray(string_) ? string_ : splitByCase(string_)).map((p) => upperFirst(p)).join("");
|
|
89
|
+
}
|
|
90
|
+
function camelCase(string_) {
|
|
91
|
+
return lowerFirst(pascalCase(string_));
|
|
92
|
+
}
|
|
93
|
+
function kebabCase(string_, joiner) {
|
|
94
|
+
return !string_ ? "" : (Array.isArray(string_) ? string_ : splitByCase(string_)).map((p) => p.toLowerCase()).join(joiner ?? "-");
|
|
95
|
+
}
|
|
96
|
+
|
|
34
97
|
function toArr(any) {
|
|
35
98
|
return any == void 0 ? [] : Array.isArray(any) ? any : [any];
|
|
36
99
|
}
|
|
@@ -149,6 +212,7 @@ function parseArgs(rawArgs, argsDef) {
|
|
|
149
212
|
const parseOptions = {
|
|
150
213
|
boolean: [],
|
|
151
214
|
string: [],
|
|
215
|
+
mixed: [],
|
|
152
216
|
alias: {},
|
|
153
217
|
default: {}
|
|
154
218
|
};
|
|
@@ -157,7 +221,11 @@ function parseArgs(rawArgs, argsDef) {
|
|
|
157
221
|
if (arg.type === "positional") {
|
|
158
222
|
continue;
|
|
159
223
|
}
|
|
160
|
-
|
|
224
|
+
if (arg.type === "string") {
|
|
225
|
+
parseOptions.string.push(arg.name);
|
|
226
|
+
} else if (arg.type === "boolean") {
|
|
227
|
+
parseOptions.boolean.push(arg.name);
|
|
228
|
+
}
|
|
161
229
|
if (arg.default !== void 0) {
|
|
162
230
|
parseOptions.default[arg.name] = arg.default;
|
|
163
231
|
}
|
|
@@ -166,7 +234,7 @@ function parseArgs(rawArgs, argsDef) {
|
|
|
166
234
|
}
|
|
167
235
|
}
|
|
168
236
|
const parsed = parseRawArgs(rawArgs, parseOptions);
|
|
169
|
-
const [
|
|
237
|
+
const [...positionalArguments] = parsed._;
|
|
170
238
|
const parsedArgsProxy = new Proxy(parsed, {
|
|
171
239
|
get(target, prop) {
|
|
172
240
|
return target[prop] ?? target[camelCase(prop)] ?? target[kebabCase(prop)];
|
|
@@ -238,7 +306,7 @@ async function runCommand(cmd, opts) {
|
|
|
238
306
|
const subCommand = await resolveValue(subCommands[subCommandName]);
|
|
239
307
|
if (subCommand) {
|
|
240
308
|
await runCommand(subCommand, {
|
|
241
|
-
rawArgs: opts.rawArgs.slice(subCommandArgIndex)
|
|
309
|
+
rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1)
|
|
242
310
|
});
|
|
243
311
|
}
|
|
244
312
|
}
|
|
@@ -255,7 +323,7 @@ async function resolveSubCommand(cmd, rawArgs, parent) {
|
|
|
255
323
|
if (subCommand) {
|
|
256
324
|
return resolveSubCommand(
|
|
257
325
|
subCommand,
|
|
258
|
-
rawArgs.slice(subCommandArgIndex),
|
|
326
|
+
rawArgs.slice(subCommandArgIndex + 1),
|
|
259
327
|
cmd
|
|
260
328
|
);
|
|
261
329
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "citty",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Elegant CLI Builder",
|
|
5
5
|
"repository": "unjs/citty",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,21 +29,19 @@
|
|
|
29
29
|
"release": "pnpm test && changelogen --release --push && npm publish",
|
|
30
30
|
"test": "pnpm lint && vitest run --coverage"
|
|
31
31
|
},
|
|
32
|
-
"dependencies": {
|
|
33
|
-
"scule": "^1.0.0"
|
|
34
|
-
},
|
|
35
32
|
"devDependencies": {
|
|
36
|
-
"@types/node": "^18.15.
|
|
33
|
+
"@types/node": "^18.15.11",
|
|
37
34
|
"@vitest/coverage-c8": "^0.29.8",
|
|
38
35
|
"changelogen": "^0.5.2",
|
|
39
36
|
"colorette": "^2.0.19",
|
|
40
|
-
"eslint": "^8.
|
|
37
|
+
"eslint": "^8.37.0",
|
|
41
38
|
"eslint-config-unjs": "^0.1.0",
|
|
42
39
|
"jiti": "^1.18.2",
|
|
43
40
|
"prettier": "^2.8.7",
|
|
44
|
-
"
|
|
45
|
-
"
|
|
41
|
+
"scule": "^1.0.0",
|
|
42
|
+
"typescript": "^5.0.3",
|
|
43
|
+
"unbuild": "^1.2.0",
|
|
46
44
|
"vitest": "^0.29.8"
|
|
47
45
|
},
|
|
48
|
-
"packageManager": "pnpm@8.
|
|
46
|
+
"packageManager": "pnpm@8.1.0"
|
|
49
47
|
}
|