@ideascol/cli-maker
Version:
A simple library to help create CLIs
129 lines (128 loc) • 8.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Validator = void 0;
const colors_1 = require("../colors");
const interfaces_1 = require("../interfaces");
class Validator {
validateParam(value, type, isRequired, options, paramName, hasOptionsLoader) {
if (this.checkEmpty(value) && isRequired) {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Missing required parameter${paramName ? `: ${colors_1.Colors.Bright}${paramName}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}` : ''}${colors_1.Colors.Reset}\n`
};
}
else if (this.checkEmpty(value) && !isRequired) {
return { value: undefined, error: "" };
}
if (value === undefined) {
return { value };
}
switch (type) {
case interfaces_1.ParamType.Number:
if (!/^[0-9]+$/.test(value)) {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid number format: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Expected: whole numbers only (e.g., 42)${colors_1.Colors.Reset}\n`
};
}
return { value: Number(value) };
case interfaces_1.ParamType.Custom:
try {
const customValue = JSON.parse(value);
if (Array.isArray(customValue) || typeof customValue === 'object') {
return { value: customValue };
}
else {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid custom value: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Expected: JSON array or object (e.g., ["item1", "item2"] or {"key": "value"})${colors_1.Colors.Reset}\n`
};
}
}
catch {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid JSON format: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Expected: Valid JSON array or object${colors_1.Colors.Reset}\n`
};
}
case interfaces_1.ParamType.List: {
if (options === undefined || options?.length === 0) {
// When an optionsLoader exists, options are materialized lazily at
// prompt time. Accept the value as-is in flag mode; the action is
// responsible for any further validation.
if (hasOptionsLoader)
return { value };
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}List parameter has no options configured${colors_1.Colors.Reset}\n`,
value: undefined
};
}
const foundValue = options?.filter(x => x === value);
if (foundValue?.length === 0) {
const total = options?.length ?? 0;
const preview = total > 12
? `${options.slice(0, 12).join(', ')}, … (+${total - 12} more)`
: options?.join(', ');
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid option: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Available options: ${preview}${colors_1.Colors.Reset}\n`,
value: undefined
};
}
return { value: value };
}
case interfaces_1.ParamType.Boolean:
if (value.toLowerCase() !== 'true' && value.toLowerCase() !== 'false') {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid boolean: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Expected: 'true' or 'false'${colors_1.Colors.Reset}\n`
};
}
return { value: value.toLowerCase() === 'true' };
case interfaces_1.ParamType.Email:
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid email format: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Expected: user@domain.com${colors_1.Colors.Reset}\n`
};
}
return { value };
case interfaces_1.ParamType.Url:
if (!/^https?:\/\/.+$/.test(value)) {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid URL format: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Expected: https://example.com or http://example.com${colors_1.Colors.Reset}\n`
};
}
return { value };
case interfaces_1.ParamType.Package:
if (!/^@[a-zA-Z0-9-]+\/[a-zA-Z0-9-]+$/.test(value)) {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid package format: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Expected: @company/package-name${colors_1.Colors.Reset}\n`
};
}
return { value };
case interfaces_1.ParamType.Array: {
try {
const arr = JSON.parse(value);
if (!Array.isArray(arr)) {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Array parameter expected JSON array, got: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n`,
};
}
return { value: arr };
}
catch {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Invalid JSON for array param: '${colors_1.Colors.Bright}${value}${colors_1.Colors.Reset}${colors_1.Colors.FgRed}'${colors_1.Colors.Reset}\n${colors_1.Colors.FgGray} Expected: JSON array (e.g., [{"k":"v"}])${colors_1.Colors.Reset}\n`,
};
}
}
case interfaces_1.ParamType.Password:
if (this.checkEmpty(value) && isRequired) {
return {
error: `\n${colors_1.Colors.BgRed}${colors_1.Colors.FgWhite} ERROR ${colors_1.Colors.Reset} ${colors_1.Colors.FgRed}Password cannot be empty${colors_1.Colors.Reset}\n`
};
}
return { value };
default:
return { value };
}
}
checkEmpty(value) {
return value === undefined || value === '' || value === null;
}
}
exports.Validator = Validator;