refactor(core): Extract CLI parsing from command registry (#17676)

This commit is contained in:
Iván Ovejero
2025-07-29 14:23:49 +02:00
committed by GitHub
parent 64902c9559
commit 163565c647
7 changed files with 214 additions and 39 deletions

View File

@@ -0,0 +1,117 @@
import { mock } from 'jest-mock-extended';
import z from 'zod';
import { CliParser } from '../cli-parser';
describe('parse', () => {
it('should parse `argv` without flags schema', () => {
const cliParser = new CliParser(mock());
const result = cliParser.parse({ argv: ['node', 'script.js', 'arg1', 'arg2'] });
expect(result).toEqual({ flags: {}, args: ['arg1', 'arg2'] });
});
it('should parse `argv` with flags schema', () => {
const cliParser = new CliParser(mock());
const flagsSchema = z.object({
verbose: z.boolean().optional(),
name: z.string().optional(),
});
const result = cliParser.parse({
argv: ['node', 'script.js', '--verbose', '--name', 'test', 'arg1'],
flagsSchema,
});
expect(result).toEqual({
flags: { verbose: true, name: 'test' },
args: ['arg1'],
});
});
it('should ignore flags not defined in schema', () => {
const cliParser = new CliParser(mock());
const flagsSchema = z.object({
name: z.string().optional(),
// ignored is absent
});
const result = cliParser.parse({
argv: ['node', 'script.js', '--name', 'test', '--ignored', 'value', 'arg1'],
flagsSchema,
});
expect(result).toEqual({
flags: {
name: 'test',
// ignored is absent
},
args: ['arg1'],
});
});
it('should handle a numeric value for `--id` flag', () => {
const cliParser = new CliParser(mock());
const result = cliParser.parse({
argv: ['node', 'script.js', '--id', '123', 'arg1'],
flagsSchema: z.object({
id: z.string(),
}),
});
expect(result).toEqual({
flags: { id: '123' },
args: ['arg1'],
});
});
it('should handle positional arguments', () => {
const cliParser = new CliParser(mock());
const result = cliParser.parse({
argv: ['node', 'script.js', '123', 'true'],
});
expect(result.args).toEqual(['123', 'true']);
expect(typeof result.args[0]).toBe('string');
expect(typeof result.args[1]).toBe('string');
});
it('should handle required flags with aliases', () => {
const cliParser = new CliParser(mock());
const flagsSchema = z.object({
name: z.string(),
});
// @ts-expect-error zod was monkey-patched to support aliases
flagsSchema.shape.name._def._alias = 'n';
const result = cliParser.parse({
argv: ['node', 'script.js', '-n', 'test', 'arg1'],
flagsSchema,
});
expect(result).toEqual({
flags: { name: 'test' },
args: ['arg1'],
});
});
it('should handle optional flags with aliases', () => {
const cliParser = new CliParser(mock());
const flagsSchema = z.object({
name: z.optional(z.string()),
});
// @ts-expect-error zod was monkey-patched to support aliases
flagsSchema.shape.name._def.innerType._def._alias = 'n';
const result = cliParser.parse({
argv: ['node', 'script.js', '-n', 'test', 'arg1'],
flagsSchema,
});
expect(result).toEqual({
flags: { name: 'test' },
args: ['arg1'],
});
});
});