Closed kimseungbin closed 18 hours ago
The pull request introduces enhancements to label configuration management in the repository. A new LabelConfig
interface and a constant labelConfigs
are defined in src/label-config.ts
, organizing label configurations for major, minor, and patch versions. The src/color-utils.ts
file adds functions for validating and manipulating hex color codes. The LabelChecker
class in src/label-checker.ts
is updated to utilize dynamic label configurations instead of hardcoded values, incorporating validation logic. Unit tests for color utility functions are added in src/color-utils.spec.ts
.
File | Change Summary |
---|---|
src/label-config.ts | Added LabelConfig interface and labelConfigs constant with predefined configurations. |
src/color-utils.ts | Introduced functions for color validation and manipulation: isHexColorCode , validateColorCode , hexToRgb , getLuminance , getContrastRatio , hasAccessibleContrast . |
src/label-checker.ts | Updated LabelChecker to import labelConfigs and added validation logic for dynamic labels. |
src/color-utils.spec.ts | Added unit tests for isHexColorCode , validateColorCode , and hasAccessibleContrast . |
Objective | Addressed | Explanation |
---|---|---|
Move label configurations to a separate file (#6) | ✅ | |
Support for different label sets for different purposes (#6) | ✅ | |
Easier modification of label configurations (#6) | ✅ | |
Addition of validation for color codes (#6) | ✅ | Validation logic implemented. |
Future support for user-defined configurations (#6) | ❓ | User-defined configurations not yet implemented. |
label-config.ts
, aligning with the request for improved validation.LabelChecker
partially address the need for dynamic label configurations instead of hardcoded values.labelConfigs
supports the future implementation of user-defined configurations.labelConfigs
align with the request to create labels for issues and PRs.🐰 In the meadow where labels bloom,
A new config chases away the gloom.
Colors bright for each version's cheer,
Major, minor, patch—oh dear!
With structure now, we hop with glee,
Labeling joyfully, come see! 🌼
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?
@coderabbitai Help me creating a validation utility for the color codes. Include:
[!TIP] For best results, initiate chat on the files or code changes.
@kimseungbin
Certainly! Here's a validation utility for the color codes that includes:
// src/color-utils.ts
// Type guard to check if a string is a valid 6-character hex color code
export function isHexColorCode(color: string): color is `#${string}` {
const hexRegex = /^#[0-9A-Fa-f]{6}$/;
return hexRegex.test(color);
}
// Function to validate color codes using the type guard
export function validateColorCode(color: string): void {
if (!isHexColorCode(color)) {
throw new Error(`Invalid color code: ${color}. It must be a 6-character hex code starting with '#'.`);
}
}
// Helper function to convert hex color code to RGB values
function hexToRgb(hex: string): { r: number; g: number; b: number } {
const sanitizedHex = hex.replace('#', '');
const bigint = parseInt(sanitizedHex, 16);
return {
r: (bigint >> 16) & 255,
g: (bigint >> 8) & 255,
b: bigint & 255,
};
}
// Function to calculate the relative luminance of a color
function getLuminance(r: number, g: number, b: number): number {
const [rsrgb, gsrgb, bsrgb] = [r, g, b].map((v) => {
v /= 255;
return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
});
return 0.2126 * rsrgb + 0.7152 * gsrgb + 0.0722 * bsrgb;
}
// Function to calculate the contrast ratio between two colors
function getContrastRatio(foreground: string, background: string): number {
const fgRgb = hexToRgb(foreground);
const bgRgb = hexToRgb(background);
const fgLuminance = getLuminance(fgRgb.r, fgRgb.g, fgRgb.b);
const bgLuminance = getLuminance(bgRgb.r, bgRgb.g, bgRgb.b);
const lighter = Math.max(fgLuminance, bgLuminance);
const darker = Math.min(fgLuminance, bgLuminance);
return (lighter + 0.05) / (darker + 0.05);
}
// Function to check color contrast for accessibility based on WCAG AA standards
export function hasAccessibleContrast(
foreground: string,
background: string,
largeText: boolean = false
): boolean {
validateColorCode(foreground);
validateColorCode(background);
const contrastRatio = getContrastRatio(foreground, background);
const minimumContrast = largeText ? 3.0 : 4.5;
return contrastRatio >= minimumContrast;
}
Explanation:
Type Guards:
isHexColorCode
is a type guard that ensures the string is a valid 6-character hex code starting with #
.Validation Function:
validateColorCode
uses the type guard to throw an error if the color code is invalid.Color Contrast Checking:
hasAccessibleContrast
calculates the contrast ratio between two colors.true
if the contrast ratio meets the accessibility standards.Usage Example:
// src/label-config.ts
import { LabelConfig } from './label-config';
import { validateColorCode, hasAccessibleContrast } from './color-utils';
const backgroundColor = '#FFFFFF'; // Assuming a white background
// Validate and process label configurations
labelConfigs.forEach((label) => {
try {
validateColorCode(label.color);
if (!hasAccessibleContrast(label.color, backgroundColor)) {
console.warn(
`The color ${label.color} for label "${label.name}" does not have sufficient contrast with the background color ${backgroundColor}.`
);
// Handle the insufficient contrast (e.g., adjust the color or notify the user)
}
} catch (error) {
console.error(error.message);
// Handle the invalid color code (e.g., skip this label or fix the color code)
}
});
Notes:
backgroundColor
with the actual background color used in your application.largeText
parameter in hasAccessibleContrast
if the labels use large text.Let me know if you need further assistance or modifications!
@codoerabbitai update PR title
Summary by CodeRabbit
Close #6