@whitemordred/react-native-bootstrap5
Version:
A complete React Native library that replicates Bootstrap 5.3 with 100% feature parity, full theming support, CSS variables, and dark/light mode
121 lines (120 loc) • 4.13 kB
JavaScript
;
/**
* Validation utilities for React Native Bootstrap 5
* These helpers ensure props are valid and provide warnings in development
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createErrorHandler = exports.validateChildren = exports.safeStyle = exports.isValidSize = exports.safeNumber = exports.safeString = exports.isValidButtonVariant = exports.isValidColorVariant = exports.isValidEnum = exports.isNotNullOrUndefined = exports.error = exports.warn = void 0;
// Development-only warning
const warn = (message) => {
if (__DEV__) {
console.warn(`[react-native-bootstrap5] ${message}`);
}
};
exports.warn = warn;
// Development-only error
const error = (message) => {
if (__DEV__) {
console.error(`[react-native-bootstrap5] ${message}`);
}
};
exports.error = error;
// Validate that a value is not null or undefined
const isNotNullOrUndefined = (value) => {
return value !== null && value !== undefined;
};
exports.isNotNullOrUndefined = isNotNullOrUndefined;
// Validate enum values
const isValidEnum = (value, validValues) => {
return validValues.includes(value);
};
exports.isValidEnum = isValidEnum;
// Validate color variant
const isValidColorVariant = (variant) => {
const validVariants = [
'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark',
'blue', 'indigo', 'purple', 'pink', 'red', 'orange', 'yellow', 'green', 'teal', 'cyan'
];
return validVariants.includes(variant);
};
exports.isValidColorVariant = isValidColorVariant;
// Validate button variant
const isValidButtonVariant = (variant) => {
const baseVariants = [
'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark', 'link',
'blue', 'indigo', 'purple', 'pink', 'red', 'orange', 'yellow', 'green', 'teal', 'cyan'
];
if (baseVariants.includes(variant))
return true;
// Check outline variants
if (variant.startsWith('outline-')) {
const baseVariant = variant.replace('outline-', '');
return baseVariants.includes(baseVariant) && baseVariant !== 'link';
}
return false;
};
exports.isValidButtonVariant = isValidButtonVariant;
// Safe string conversion
const safeString = (value, fallback = '') => {
if (typeof value === 'string')
return value;
if ((0, exports.isNotNullOrUndefined)(value)) {
try {
return String(value);
}
catch (_a) {
(0, exports.warn)(`Failed to convert value to string: ${value}`);
}
}
return fallback;
};
exports.safeString = safeString;
// Safe number conversion
const safeNumber = (value, fallback = 0) => {
if (typeof value === 'number' && !isNaN(value))
return value;
const parsed = Number(value);
if (!isNaN(parsed))
return parsed;
(0, exports.warn)(`Invalid number value: ${value}, using fallback: ${fallback}`);
return fallback;
};
exports.safeNumber = safeNumber;
// Validate size prop
const isValidSize = (size) => {
return ['sm', 'md', 'lg', 'xl', 'default'].includes(size);
};
exports.isValidSize = isValidSize;
// Create a safe style object
const safeStyle = (style) => {
if (!style)
return {};
if (Array.isArray(style)) {
return style.filter(Boolean).map(exports.safeStyle);
}
if (typeof style === 'object') {
return style;
}
(0, exports.warn)(`Invalid style prop: ${style}`);
return {};
};
exports.safeStyle = safeStyle;
// Validate children prop
const validateChildren = (children, componentName) => {
if (!children) {
(0, exports.warn)(`${componentName} requires children prop`);
return false;
}
return true;
};
exports.validateChildren = validateChildren;
// Create a default error handler
const createErrorHandler = (componentName) => {
return (error) => {
if (__DEV__) {
console.error(`[${componentName}] Error:`, error);
}
// In production, you might want to send this to a monitoring service
};
};
exports.createErrorHandler = createErrorHandler;