Skip to main content

Quantities and units

Every number fit hands back carries its unit: a Distance, a Duration, a Pace. You read it in the unit you want, or format it for display, and you can't mistake metres for miles on the way.

import { readFileSync } from 'node:fs';
import { readActivity } from '@pond-ts/fit/files';

const run = readActivity(readFileSync('interval-run.fit'));
const { distance, time, pace, speed } = run.stats();

console.log(
distance?.meters.toFixed(0),
distance?.km.toFixed(2),
distance?.miles.toFixed(2),
);
console.log(distance?.format('km'), distance?.format('mi', 1));
console.log(
time.elapsed?.seconds,
time.elapsed?.minutes.toFixed(1),
time.elapsed?.format(),
);
console.log(pace.average?.format('metric'), pace.average?.format('imperial'));
console.log(speed.average?.kmh.toFixed(1), speed.average?.format('imperial'));
9702 9.70 6.03
9.70 km 6.0 mi
3083 51.4 51:23
5:18/km 8:31/mi
11.3 7.0 mph

Making them​

Short helpers make the values you pass in: to pick a stretch, ask for splits or name a best effort.

import {
km,
miles,
yards,
seconds,
minutes,
hours,
Pace,
Power,
} from '@pond-ts/fit';

console.log(km(5).meters, miles(1).meters.toFixed(1), yards(25).meters);
console.log(minutes(20).seconds, hours(1.5).format(), seconds(95).format());
console.log(
Pace.secondsPerKm(240).format('imperial'),
Power.watts(300).perKg(72).toFixed(2),
);
5000 1609.3 22.86
1200 1:30:00 1:35
6:26/mi 4.17

The types​

TypeHoldsRead it asFormat
Distancemetres.meters .km .miles .yardsformat('km' | 'mi', decimals)
Durationseconds.seconds .minutes .hoursformat() → h:mm:ss
Speedmetres per second.metersPerSecond .kmh .mphformat('metric' | 'imperial')
Paceseconds per kilometre.secondsPerKm .secondsPerMileformat('metric' | 'imperial')
Elevationmetres.meters .feetformat('m' | 'ft')
Powerwatts.watts, .perKg(weight)format() → "212 W"
HeartRatebeats per minute.bpmformat() → "152 bpm"
Cadenceper minute.rpmformat()

Speed and Pace turn into each other (speed.pace(), pace.speed()). A standstill has a speed of zero and no pace: stats().pace.average is null for a stretch with no distance, rather than an infinite pace.