Skip to main content

Module System

FitFileViewer uses root-owned build, lint, and test tooling with Electron source under electron-app/. Runtime modules are TypeScript-first and are compiled by root scripts into dist/.

Module Organization​

electron-app/utils/
β”œβ”€β”€ app/ # Application lifecycle, menu, initialization, and performance helpers
β”œβ”€β”€ async/ # Small async compatibility helpers
β”œβ”€β”€ charts/ # Chart components, core rendering, plugins, and theming
β”œβ”€β”€ config/ # Shared constants and configuration exports
β”œβ”€β”€ data/ # Lookups, processors, derived metrics, and zone helpers
β”œβ”€β”€ debug/ # Debug overlays, state devtools, and diagnostics
β”œβ”€β”€ docs/ # Runtime documentation metadata helpers
β”œβ”€β”€ dom/ # DOM escaping and sanitization helpers
β”œβ”€β”€ errors/ # Error normalization and reporting helpers
β”œβ”€β”€ files/ # FIT import, export, recent-file, and file browser workflows
β”œβ”€β”€ formatting/ # Unit conversion and display formatters
β”œβ”€β”€ legacy/ # Temporary compatibility globals while old renderer code is retired
β”œβ”€β”€ logging/ # Renderer/main logging utilities
β”œβ”€β”€ maps/ # Leaflet controls, filters, layers, and map rendering
β”œβ”€β”€ net/ # Network and remote-resource helpers
β”œβ”€β”€ performance/ # Runtime performance helpers
β”œβ”€β”€ rendering/ # Summary, table, and shared render helpers
β”œβ”€β”€ runtime/ # Runtime environment guards such as process env access
β”œβ”€β”€ state/ # State core, domain managers, and main-process integration
β”œβ”€β”€ storage/ # Storage abstractions
β”œβ”€β”€ theming/ # Theme core and map-specific theme integration
β”œβ”€β”€ types/ # Shared lightweight runtime types
└── ui/ # Controls, modals, notifications, tabs, browser tab, and layout helpers

Use rg --files electron-app/utils for exact module names. Do not document generated JavaScript output as source files.

Module Categories​

Formatting​

Formatting utilities live under electron-app/utils/formatting/:

AreaExample source filePurpose
Converterselectron-app/utils/formatting/converters/convertDistanceUnits.tsUnit conversion
Displayelectron-app/utils/formatting/display/formatTooltipData.tsChart and table display helpers
Formatterselectron-app/utils/formatting/formatters/formatDistance.tsUser-facing value formatting
Domain indexelectron-app/utils/formatting/index.tsPublic formatting exports

Maps​

Map modules are grouped by role:

AreaExample source filePurpose
Coreelectron-app/utils/maps/core/renderMap.tsMain map rendering
Controlselectron-app/utils/maps/controls/mapMeasureTool.tsUser-facing map controls
Layerselectron-app/utils/maps/layers/mapBaseLayers.tsTile layers and route draw
Filterselectron-app/utils/maps/filters/mapMetricFilter.tsRoute metric filtering

Charts​

Chart modules are split between orchestration, rendering, plugins, DOM helpers, and theme integration:

AreaExample source filePurpose
Coreelectron-app/utils/charts/core/renderChartJS.tsChart rendering orchestration
Renderingelectron-app/utils/charts/rendering/renderGPSTrackChart.tsSpecific chart renderers
Pluginselectron-app/utils/charts/plugins/chartZoomResetPlugin.tsChart.js plugin integration
Componentselectron-app/utils/charts/components/createEnhancedChart.tsChart DOM/component helpers
Themingelectron-app/utils/charts/theming/chartThemeUtils.tsChart theme and color handling

State​

State modules are organized by responsibility:

AreaExample source filePurpose
Coreelectron-app/utils/state/core/stateManager.tsObservable state store
Domainelectron-app/utils/state/domain/fitFileState.tsDomain-specific state workflows
Integrationelectron-app/utils/state/integration/mainProcessStateClient.tsRenderer/main state bridge
Indexelectron-app/utils/state/index.tsPublic state exports

UI​

UI utilities are grouped by workflow:

AreaExample source filePurpose
Controlselectron-app/utils/ui/controls/enableTabButtons.tsInteractive control setup
Modalselectron-app/utils/ui/modals/ensureAboutModal.tsModal creation and behavior
Notificationselectron-app/utils/ui/notifications/showNotification.tsUser notifications
Tabselectron-app/utils/ui/tabs/tabStateManager.tsTab coordination
Browserelectron-app/utils/ui/browser/initFitBrowserFeatureGate.tsFIT browser feature gating

Import Patterns​

Direct Import​

TypeScript source imports use runtime .js specifiers so the emitted modules resolve correctly:

import { formatDistance } from "./utils/formatting/formatters/formatDistance.js";

Barrel Export​

// electron-app/utils/formatting/formatters/index.ts
export { formatDistance } from "./formatDistance.js";
export { formatDuration } from "./formatDuration.js";

// Usage from a nearby source file
import { formatDistance, formatDuration } from "./utils/formatting/index.js";

Dynamic Import​

const { renderMap } = await import("./utils/maps/core/renderMap.js");

Module Standards​

Single Responsibility​

Keep modules focused on one domain concern:

export function formatDistance(meters: number): string {
// Only handles distance formatting
}

Avoid mixing unrelated behavior in a single module:

export function formatDistance(): string {
return "";
}

export function renderChart(): void {
// Chart rendering belongs in the chart domain, not formatting.
}

Clear Exports​

export function formatDistance(meters: number): string {
return `${meters} m`;
}

export function convertToMiles(meters: number): number {
return meters / 1609.344;
}

Documentation​

/**
* Formats a distance value for display.
*
* @example
* formatDistance(5000);
*
* @param meters - Distance in meters
* @returns Formatted distance string
*/
export function formatDistance(meters: number): string {
return `${(meters / 1000).toFixed(2)} km`;
}

Module Dependencies​

Dependency Rules​

  1. Keep generated output under root dist/; source stays under electron-app/.
  2. Prefer domain indexes for shared exports.
  3. Avoid circular dependencies between utility domains.
  4. Keep low-level helpers independent from UI and renderer orchestration.

Next: Data Flow β†’