Skip to content

Commit 85ad8c1

Browse files
authored
feat: allow accessing args with camelCase or kebabCase (#17)
1 parent 40816ab commit 85ad8c1

File tree

4 files changed

+20
-7
lines changed

4 files changed

+20
-7
lines changed

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,8 @@
4242
"unbuild": "^1.1.2",
4343
"vitest": "^0.29.7"
4444
},
45-
"packageManager": "[email protected]"
45+
"packageManager": "[email protected]",
46+
"dependencies": {
47+
"scule": "^1.0.0"
48+
}
4649
}

playground/commands/build.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default defineCommand({
2121
description: "disable hot module replacement",
2222
default: true,
2323
},
24-
dir: {
24+
workDir: {
2525
type: "string",
2626
description: "working directory",
2727
required: true,

pnpm-lock.yaml

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/args.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { kebabCase, camelCase } from "scule";
12
import { parseRawArgs } from "./_parser";
23
import type { Arg, ArgsDef, ParsedArgs } from "./types";
34
import { CLIError, toArray } from "./_utils";
@@ -28,25 +29,31 @@ export function parseArgs(rawArgs: string[], argsDef: ArgsDef): ParsedArgs {
2829
const parsed = parseRawArgs(rawArgs, parseOptions);
2930
const [, ...positionalArguments] = parsed._;
3031

32+
const parsedArgsProxy = new Proxy(parsed, {
33+
get(target: ParsedArgs, prop: string) {
34+
return target[prop] ?? target[camelCase(prop)] ?? target[kebabCase(prop)];
35+
},
36+
});
37+
3138
for (const [, arg] of args.entries()) {
3239
if (arg.type === "positional") {
3340
const nextPositionalArgument = positionalArguments.shift();
3441
if (nextPositionalArgument !== undefined) {
35-
parsed[arg.name] = nextPositionalArgument;
42+
parsedArgsProxy[arg.name] = nextPositionalArgument;
3643
} else if (arg.default !== undefined) {
37-
parsed[arg.name] = arg.default;
44+
parsedArgsProxy[arg.name] = arg.default;
3845
} else {
3946
throw new CLIError(
4047
`Missing required positional argument: ${arg.name.toUpperCase()}`,
4148
"EARG"
4249
);
4350
}
44-
} else if (arg.required && parsed[arg.name] === undefined) {
51+
} else if (arg.required && parsedArgsProxy[arg.name] === undefined) {
4552
throw new CLIError(`Missing required argument: --${arg.name}`, "EARG");
4653
}
4754
}
4855

49-
return parsed;
56+
return parsedArgsProxy;
5057
}
5158

5259
export function resolveArgs(argsDef: ArgsDef): Arg[] {

0 commit comments

Comments
 (0)