UNPKG

@ideascol/cli-maker

Version:
129 lines (128 loc) 8.5 kB
"use strict"; 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;