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 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 _interopNamespaceDefault(e) {
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__*/_interopNamespaceDefault(tty);
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
- parseOptions[arg.type || "boolean"].push(arg.name);
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 [, ...positionalArguments] = parsed._;
253
+ const [...positionalArguments] = parsed._;
185
254
  const parsedArgsProxy = new Proxy(parsed, {
186
255
  get(target, prop) {
187
- return target[prop] ?? target[scule.camelCase(prop)] ?? target[scule.kebabCase(prop)];
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 | boolean> & Record<{
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
- parseOptions[arg.type || "boolean"].push(arg.name);
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 [, ...positionalArguments] = parsed._;
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.0.2",
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.10",
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.36.0",
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
- "typescript": "^5.0.2",
45
- "unbuild": "^1.1.2",
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.0.0"
46
+ "packageManager": "pnpm@8.1.0"
49
47
  }