Skip to main content

Module System

FitFileViewer uses a modular architecture with 50+ utility modules organized by functionality.

Module Organization​

utils/
β”œβ”€β”€ formatting/ # Data formatting
β”‚ β”œβ”€β”€ formatDistance.js
β”‚ β”œβ”€β”€ formatDuration.js
β”‚ β”œβ”€β”€ formatSpeed.js
β”‚ └── ...
β”œβ”€β”€ maps/ # Map functionality
β”‚ β”œβ”€β”€ renderMap.js
β”‚ β”œβ”€β”€ mapBaseLayers.js
β”‚ β”œβ”€β”€ mapDrawLaps.js
β”‚ └── ...
β”œβ”€β”€ charts/ # Chart functionality
β”‚ β”œβ”€β”€ chartSpec.js
β”‚ β”œβ”€β”€ renderChartJS.js
β”‚ └── ...
β”œβ”€β”€ state/ # State management
β”‚ β”œβ”€β”€ core/
β”‚ └── managers/
β”œβ”€β”€ files/ # File operations
β”‚ β”œβ”€β”€ handleOpenFile.js
β”‚ β”œβ”€β”€ recentFiles.js
β”‚ └── ...
β”œβ”€β”€ ui/ # UI components
β”‚ β”œβ”€β”€ tabManager.js
β”‚ β”œβ”€β”€ fullscreen.js
β”‚ └── ...
└── ... # More modules

Module Categories​

Formatting Modules​

Handle data display formatting:

ModulePurpose
formatDistance.jsDistance values
formatDuration.jsTime durations
formatSpeed.jsSpeed/pace
formatUtils.jsGeneral utilities

Map Modules​

Geographic visualization:

ModulePurpose
renderMap.jsMain map rendering
mapBaseLayers.jsTile layer providers
mapDrawLaps.jsLap marker drawing
mapFullscreenControl.jsFullscreen mode
mapMeasureTool.jsDistance measurement

Chart Modules​

Data visualization:

ModulePurpose
chartSpec.jsChart configuration
renderChartJS.jsChart.js rendering
vegaLiteUtils.jsVega-Lite charts

State Modules​

Application state:

ModulePurpose
stateManager.jsCentral state
themeManager.jsTheme state
fileStateManager.jsFile state

UI Modules​

User interface:

ModulePurpose
tabManager.jsTab navigation
fullscreen.jsFullscreen handling
setupWindow.jsWindow setup

Import Patterns​

Direct Import​

import { formatDistance } from './utils/formatting/formatDistance.js';

Barrel Export​

// utils/formatting/index.js
export { formatDistance } from './formatDistance.js';
export { formatDuration } from './formatDuration.js';

// Usage
import { formatDistance, formatDuration } from './utils/formatting/index.js';

Dynamic Import​

// Lazy loading for performance
const { renderMap } = await import('./utils/maps/renderMap.js');

Module Standards​

Single Responsibility​

Each module has one clear purpose:

// Good: Single responsibility
// formatDistance.js
export function formatDistance(meters, unit = 'km') {
// Only handles distance formatting
}

// Bad: Multiple responsibilities
// formatters.js
export function formatDistance() { }
export function formatDuration() { }
export function renderChart() { } // Unrelated

Clear Exports​

// Named exports preferred
export function formatDistance(meters) { }
export function convertToMiles(meters) { }

// Default export for main functionality
export default function formatDistance(meters) { }

Documentation​

/**
* Formats a distance value for display.
*
* @param {number} meters - Distance in meters
* @param {string} unit - Target unit ('km' or 'mi')
* @returns {string} Formatted distance string
*
* @example
* formatDistance(5000); // "5.00 km"
* formatDistance(5000, 'mi'); // "3.11 mi"
*/
export function formatDistance(meters, unit = 'km') {
// Implementation
}

Module Dependencies​

Dependency Graph​

Dependency Rules​

  1. No circular dependencies
  2. Lower modules don't import higher
  3. Formatting is a base layer

Next: Data Flow β†’