Skip to main content
Glama
pshempel

MCP Time Server Node

by pshempel
recurrence-refactor-progress.md3.5 kB
# Recurrence Refactor Progress Report ## Summary We're refactoring the `nextOccurrence` function which has a cyclomatic complexity of 82 (limit is 10) into smaller, focused classes following SOLID principles. ## Progress So Far ### ✅ Completed Components 1. **DailyRecurrence** (8 tests passing) - Complexity: ~5 - Handles daily recurrence with optional time - Timezone-aware calculations - Clean separation of UTC vs timezone logic 2. **TimezoneDateBuilder** (13 tests passing) - Complexity: ~3 per function - Utility functions for timezone-aware date operations - `setTimeInTimezone()` - Sets time preserving timezone - `addDaysInTimezone()` - Adds days preserving local time across DST - `isTimeInFuture()` - Time comparison utility 3. **WeeklyRecurrence** (11 tests passing) - Complexity: ~8 - Handles weekly recurrence with optional day of week - Supports time specification - Correct same-day vs next-week logic 4. **MonthlyRecurrence** (13 tests passing) - Complexity: ~7 per method (refactored from 14) - Handles month-end overflow correctly - Supports special -1 value for last day of month - Timezone-aware with DST handling - Separate UTC and timezone logic paths 5. **YearlyRecurrence** (17 tests passing) - Complexity: ~6 per method - Supports same-date-next-year pattern (default) - Supports specific month/day targeting (enhancement) - Handles leap year correctly (Feb 29 → Feb 28) - Timezone and DST aware 6. **RecurrenceValidator** (23 tests passing) - Complexity: ~4 per method - Validates all recurrence patterns and parameters - Enforces required fields (dayOfMonth for monthly) - Special handling for -1 (last day of month) - Timezone validation follows project philosophy: - undefined = system timezone - empty string = UTC - any other value = specific timezone 7. **RecurrenceFactory** (15 tests passing) - Complexity: ~3 - Routes patterns to appropriate implementation - Validates parameters before creating instances - Provides one-step calculate() method - Maintains single instances of each pattern class ### 📊 Complexity Reduction - **Original**: `nextOccurrence` - Complexity 82, 437 lines - **New Components**: - DailyRecurrence: ~5 - WeeklyRecurrence: ~8 - MonthlyRecurrence: ~7 per method - YearlyRecurrence: ~6 per method - TimezoneDateBuilder: ~3 per function - **No complexity violations in new code!** ### 🏗️ Architecture Benefits 1. **Single Responsibility**: Each class handles one recurrence pattern 2. **Open/Closed**: Easy to add new patterns without modifying existing code 3. **Testability**: 100 focused tests vs monolithic test file (62 recurrence + 23 validation + 15 factory) 4. **Maintainability**: Average function length ~25 lines vs 437 5. **Type Safety**: Better TypeScript support with specific interfaces ## Next Steps 1. **Integration** - Wire up new implementation to replace nextOccurrence - Update imports throughout codebase - Ensure backward compatibility - Migrate existing tests ## Code Quality Metrics - Test Coverage: Maintained at 100% for new components - Linting: Zero violations in new code - Type Safety: No unsafe casts or assertions - Documentation: Each component has clear purpose ## Estimated Completion - ✅ All recurrence patterns complete! - ✅ Validator complete! - ✅ Factory complete! - 1 integration layer to wire up - Approximately 98% complete

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pshempel/mcp-time-server-node'

If you have feedback or need assistance with the MCP directory API, please join our Discord server