analyze-calculateDuration-main.js•5.58 kB
#!/usr/bin/env node
/**
* Research script to understand calculateDuration main function complexity
* Current: 122 lines, complexity 32
*/
console.log('=== calculateDuration Main Function Complexity Analysis ===\n');
console.log('Current Implementation Structure:');
console.log('1. Parameter validation (string lengths)');
console.log('2. Cache key generation and lookup');
console.log('3. Unit validation');
console.log('4. Timezone validation');
console.log('5. Parse start_time (Unix timestamp, local time, ISO)');
console.log('6. Parse end_time (same logic)');
console.log('7. Calculate differences (ms, seconds, minutes, hours, days)');
console.log('8. Format result based on unit parameter');
console.log('9. Cache and return result\n');
console.log('Complexity Contributors (32 total):');
console.log('1. Function entry: +1');
console.log('2. if (typeof start_time === \'string\'): +1');
console.log('3. if (typeof end_time === \'string\'): +1');
console.log('4. ?? operator for unit: +1');
console.log('5. Ternary for timezone (=== \'\'): +1');
console.log('6. ?? operator for timezone default: +1');
console.log('7. if (cached): +1');
console.log('8. if (unit && !validUnits.includes): +2');
console.log('9. if (timezone && !validateTimezone): +2');
console.log('10-11. Start time parsing: ~7-8 complexity');
console.log(' - try block: +1');
console.log(' - if (regex test): +1');
console.log(' - && operator: +1');
console.log(' - if (isNaN): +1');
console.log(' - else if (timezone && !includes && !regex): +3');
console.log(' - if (!isValid): +1');
console.log('12-13. End time parsing: ~7-8 complexity (duplicate)');
console.log('14. if (unit !== \'auto\' && unit !== \'milliseconds\'): +2');
console.log('15. Nested ternaries for value: +3');
console.log('16. Total: ~32\n');
console.log('=== Refactoring Strategy ===\n');
console.log('Phase 1 - Extract validation helpers:');
console.log('1. validateUnit(unit: string | undefined): string');
console.log(' - Returns validated unit or \'auto\'');
console.log(' - Throws if invalid\n');
console.log('2. resolveTimezone(timezone: string | undefined, defaultTimezone: string): string');
console.log(' - Handles empty string → UTC logic');
console.log(' - Returns resolved timezone\n');
console.log('Phase 2 - Extract date parsing:');
console.log('3. parseTimeParameter(time: string, timezone: string): Date');
console.log(' - Handles Unix timestamp, local time, ISO parsing');
console.log(' - Reduces complexity by ~7-8 per time parameter\n');
console.log('Phase 3 - Extract calculation helpers:');
console.log('4. calculateDurationValues(startDate: Date, endDate: Date): DurationValues');
console.log(' - Returns all duration calculations');
console.log(' - Simplifies main function\n');
console.log('5. formatDurationResult(values: DurationValues, unit: string): string');
console.log(' - Handles unit-specific formatting');
console.log(' - Removes nested ternaries\n');
console.log('Expected Phases:');
console.log('- Phase 1: Validation helpers (commit after tests pass)');
console.log('- Phase 2: Date parsing helper (commit after tests pass)');
console.log('- Phase 3: Calculation helpers (commit after tests pass)');
console.log('- Final: Update main function to use all helpers\n');
console.log('Expected Result:');
console.log('- Main function complexity: ~10-12');
console.log('- 4-5 logical commits');
console.log('- Good breaking points between phases\n');
// Test current patterns
console.log('=== Testing Current Behavior Patterns ===\n');
// Unit validation
function validateUnit(unit) {
const validUnits = ['auto', 'milliseconds', 'seconds', 'minutes', 'hours', 'days'];
const resolved = unit ?? 'auto';
if (!validUnits.includes(resolved)) {
throw new Error(`Invalid unit: ${resolved}`);
}
return resolved;
}
console.log('Unit Validation Tests:');
const unitTests = [
{ input: undefined, expected: 'auto' },
{ input: 'auto', expected: 'auto' },
{ input: 'seconds', expected: 'seconds' },
{ input: 'invalid', shouldThrow: true },
];
unitTests.forEach(({ input, expected, shouldThrow }) => {
try {
const result = validateUnit(input);
const pass = !shouldThrow && result === expected ? '✓' : '✗';
console.log(`${pass} validateUnit(${input === undefined ? 'undefined' : `'${input}'`}) = '${result}'`);
} catch (e) {
const pass = shouldThrow ? '✓' : '✗';
console.log(`${pass} validateUnit('${input}') threw: ${e.message}`);
}
});
// Timezone resolution
function resolveTimezone(timezone, defaultTimezone) {
return timezone === '' ? 'UTC' : (timezone ?? defaultTimezone);
}
console.log('\nTimezone Resolution Tests:');
const timezoneTests = [
{ input: undefined, default: 'America/New_York', expected: 'America/New_York' },
{ input: '', default: 'America/New_York', expected: 'UTC' },
{ input: 'Europe/London', default: 'America/New_York', expected: 'Europe/London' },
];
timezoneTests.forEach(({ input, default: def, expected }) => {
const result = resolveTimezone(input, def);
const pass = result === expected ? '✓' : '✗';
console.log(`${pass} resolveTimezone(${input === undefined ? 'undefined' : `'${input}'`}, '${def}') = '${result}'`);
});
console.log('\nGood Breaking Points:');
console.log('1. After Phase 1 (validation helpers) - Quick win, low complexity');
console.log('2. After Phase 2 (date parsing) - Major complexity reduction');
console.log('3. After Phase 3 (calculations) - Clean separation');
console.log('4. After final integration - Complete refactoring');