-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparse-args.ts
More file actions
66 lines (54 loc) · 1.56 KB
/
parse-args.ts
File metadata and controls
66 lines (54 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
function coerceValue(value: string): unknown {
if (value === 'true') return true;
if (value === 'false') return false;
// Try JSON parse for arrays/objects
if ((value.startsWith('[') && value.endsWith(']')) ||
(value.startsWith('{') && value.endsWith('}'))) {
try {
return JSON.parse(value);
} catch {
return value;
}
}
// Coerce integers only — floats stay as strings to preserve precision
// (Slack timestamps like thread_ts="1716000000.001200" lose trailing zeros as numbers)
if (/^-?\d+$/.test(value) && !(/^0\d/.test(value))) {
const num = Number(value);
if (!isNaN(num)) return num;
}
return value;
}
function kebabToSnake(str: string): string {
return str.replace(/-/g, '_');
}
export function parseArgs(argv: string[]): Record<string, unknown> {
const result: Record<string, unknown> = {};
let i = 0;
while (i < argv.length) {
const arg = argv[i];
if (!arg.startsWith('--')) {
i++;
continue;
}
// Handle --flag=value
if (arg.includes('=')) {
const eqIndex = arg.indexOf('=');
const key = kebabToSnake(arg.slice(2, eqIndex));
const value = arg.slice(eqIndex + 1);
result[key] = coerceValue(value);
i++;
continue;
}
const key = kebabToSnake(arg.slice(2));
const next = argv[i + 1];
// Standalone flag (no value, or next arg is also a flag)
if (next === undefined || next.startsWith('--')) {
result[key] = true;
i++;
continue;
}
result[key] = coerceValue(next);
i += 2;
}
return result;
}