running-tools

A collection of tools for runners and their coaches
git clone https://git.ashermorgan.net/running-tools/
Log | Files | Refs | README

commit 8e3828aed14f5cf61c19c8941103ca7e06c19739
parent 608a6f6768a41f4b8c0e21742aeaac5b105955e9
Author: Asher Morgan <59518073+ashermorgan@users.noreply.github.com>
Date:   Thu, 13 Jun 2024 15:01:44 -0700

Migrate to ES6 modules with named exports

Diffstat:
Mpackage.json | 1+
Mplaywright.config.js | 4++--
Msrc/components/DecimalInput.vue | 4++--
Msrc/components/PaceInput.vue | 5++---
Msrc/components/SplitOutputTable.vue | 20++++++++++----------
Msrc/components/TargetEditor.vue | 6+++---
Msrc/components/TargetSetSelector.vue | 6+++---
Msrc/utils/calculators.js | 56+++++++++++++++++++++++++-------------------------------
Msrc/utils/format.js | 9++-------
Msrc/utils/paces.js | 9++-------
Msrc/utils/races.js | 16++++++----------
Msrc/utils/targets.js | 15+++++----------
Msrc/utils/units.js | 44+++++++++++++-------------------------------
Msrc/views/PaceCalculator.vue | 12++++++------
Msrc/views/RaceCalculator.vue | 24++++++++++++------------
Msrc/views/SplitCalculator.vue | 8++++----
Msrc/views/UnitCalculator.vue | 25+++++++++++++------------
Mtests/e2e/cross-calculator.spec.js | 2+-
Mtests/e2e/pace-calculator.spec.js | 2+-
Mtests/e2e/race-calculator.spec.js | 2+-
Mtests/e2e/split-calculator.spec.js | 2+-
Mtests/e2e/unit-calculator.spec.js | 2+-
Mtests/unit/utils/calculators.spec.js | 2+-
Mtests/unit/utils/format.spec.js | 2+-
Mtests/unit/utils/paces.spec.js | 2+-
Mtests/unit/utils/races.spec.js | 2+-
Mtests/unit/utils/targets.spec.js | 2+-
Mtests/unit/utils/units.spec.js | 2+-
Mtests/unit/views/PaceCalculator.spec.js | 4++--
Mtests/unit/views/RaceCalculator.spec.js | 4++--
30 files changed, 126 insertions(+), 168 deletions(-)

diff --git a/package.json b/package.json @@ -3,6 +3,7 @@ "version": "1.3.0", "description": "A collection of tools for runners and their coaches that calculate splits, predict race times, convert units, and more", "private": true, + "type": "module", "scripts": { "dev": "vite", "build": "vite build", diff --git a/playwright.config.js b/playwright.config.js @@ -1,5 +1,5 @@ // @ts-check -const { defineConfig, devices } = require('@playwright/test'); +import { defineConfig, devices } from '@playwright/test'; /** * Read environment variables from file. @@ -10,7 +10,7 @@ const { defineConfig, devices } = require('@playwright/test'); /** * @see https://playwright.dev/docs/test-configuration */ -module.exports = defineConfig({ +export default defineConfig({ testDir: './tests/e2e', /* Run tests in files in parallel */ fullyParallel: true, diff --git a/src/components/DecimalInput.vue b/src/components/DecimalInput.vue @@ -4,7 +4,7 @@ <script setup> import { ref, watch } from 'vue'; -import formatUtils from '@/utils/format'; +import { formatNumber } from '@/utils/format'; /** * The component value @@ -94,7 +94,7 @@ function onblur() { * @returns {String} The formated string */ function format(value) { - return formatUtils.formatNumber(value, props.padding, props.digits, true); + return formatNumber(value, props.padding, props.digits, true); } </script> diff --git a/src/components/PaceInput.vue b/src/components/PaceInput.vue @@ -5,7 +5,7 @@ <decimal-input v-model="model.distanceValue" :aria-label="label + ' distance value'" :min="0" :digits="2"/> <select v-model="model.distanceUnit" :aria-label="label + ' distance unit'"> - <option v-for="(value, key) in distanceUnits" :key="key" :value="key"> + <option v-for="(value, key) in DISTANCE_UNITS" :key="key" :value="key"> {{ value.name }} </option> </select> @@ -21,8 +21,7 @@ import DecimalInput from '@/components/DecimalInput.vue'; import TimeInput from '@/components/TimeInput.vue'; -import unitUtils from '@/utils/units'; -const distanceUnits = unitUtils.DISTANCE_UNITS; +import { DISTANCE_UNITS } from '@/utils/units'; /** * The component value diff --git a/src/components/SplitOutputTable.vue b/src/components/SplitOutputTable.vue @@ -18,12 +18,12 @@ <tbody> <tr v-for="(item, index) in results" :key="index"> <td> - {{ formatUtils.formatNumber(item.distanceValue, 0, 2, false) }} - {{ unitUtils.DISTANCE_UNITS[item.distanceUnit].symbol }} + {{ formatNumber(item.distanceValue, 0, 2, false) }} + {{ DISTANCE_UNITS[item.distanceUnit].symbol }} </td> <td> - {{ formatUtils.formatDuration(item.time, 3, 2, true) }} + {{ formatDuration(item.time, 3, 2, true) }} </td> <td> @@ -31,8 +31,8 @@ </td> <td> - {{ formatUtils.formatDuration(item.pace, 3, 0, true) }} - / {{ unitUtils.DISTANCE_UNITS[unitUtils.getDefaultDistanceUnit(defaultUnitSystem)] + {{ formatDuration(item.pace, 3, 0, true) }} + / {{ DISTANCE_UNITS[getDefaultDistanceUnit(defaultUnitSystem)] .symbol }} </td> </tr> @@ -49,8 +49,8 @@ <script setup> import { computed } from 'vue'; -import formatUtils from '@/utils/format'; -import unitUtils from '@/utils/units'; +import { formatDuration, formatNumber } from '@/utils/format'; +import { DISTANCE_UNITS, convertDistance, getDefaultDistanceUnit } from '@/utils/units'; import TimeInput from '@/components/TimeInput.vue'; @@ -85,15 +85,15 @@ const results = computed(() => { const totalTime = i === 0 ? splitTime : results[i - 1].time + splitTime; // Calculate split and total distances - const totalDistance = unitUtils.convertDistance( + const totalDistance = convertDistance( targets.value[i].distanceValue, targets.value[i].distanceUnit, 'meters', ); const splitDistance = i === 0 ? totalDistance : totalDistance - results[i - 1].distance; // Calculate pace - const pace = splitTime / unitUtils.convertDistance(splitDistance, 'meters', - unitUtils.getDefaultDistanceUnit(props.defaultUnitSystem)); + const pace = splitTime / convertDistance(splitDistance, 'meters', + getDefaultDistanceUnit(props.defaultUnitSystem)); // Add row to results array results.push({ diff --git a/src/components/TargetEditor.vue b/src/components/TargetEditor.vue @@ -26,7 +26,7 @@ <decimal-input v-model="item.distanceValue" aria-label="Target distance value" :min="0" :digits="2"/> <select v-model="item.distanceUnit" aria-label="Target distance unit"> - <option v-for="(value, key) in unitUtils.DISTANCE_UNITS" :key="key" :value="key"> + <option v-for="(value, key) in DISTANCE_UNITS" :key="key" :value="key"> {{ value.name }} </option> </select> @@ -70,7 +70,7 @@ import { watch, ref } from 'vue'; import VueFeather from 'vue-feather'; -import unitUtils from '@/utils/units'; +import { DISTANCE_UNITS, getDefaultDistanceUnit } from '@/utils/units'; import DecimalInput from '@/components/DecimalInput.vue'; import TimeInput from '@/components/TimeInput.vue'; @@ -141,7 +141,7 @@ function addDistanceTarget() { internalValue.value.targets.push({ type: 'distance', distanceValue: 1, - distanceUnit: unitUtils.getDefaultDistanceUnit(props.defaultUnitSystem), + distanceUnit: getDefaultDistanceUnit(props.defaultUnitSystem), }); } diff --git a/src/components/TargetSetSelector.vue b/src/components/TargetSetSelector.vue @@ -24,7 +24,7 @@ import { computed, nextTick, ref } from 'vue'; import VueFeather from 'vue-feather'; -import targetUtils from '@/utils/targets'; +import { sort, defaultTargetSets } from '@/utils/targets'; import TargetEditor from '@/components/TargetEditor.vue'; @@ -106,7 +106,7 @@ function revertTargetSet() { if (internalValue.value.startsWith('_')) { // Revert default set targetSets.value[internalValue.value] = - JSON.parse(JSON.stringify(targetUtils.defaultTargetSets[internalValue.value])); + JSON.parse(JSON.stringify(defaultTargetSets[internalValue.value])); sortTargetSet(); } else { // Remove custom set @@ -121,7 +121,7 @@ function revertTargetSet() { */ function sortTargetSet() { targetSets.value[internalValue.value].targets = - targetUtils.sort(targetSets.value[internalValue.value].targets); + sort(targetSets.value[internalValue.value].targets); } </script> diff --git a/src/utils/calculators.js b/src/utils/calculators.js @@ -1,7 +1,7 @@ -import formatUtils from '@/utils/format'; -import paceUtils from '@/utils/paces'; -import raceUtils from '@/utils/races'; -import unitUtils from '@/utils/units'; +import { formatDuration, formatNumber } from '@/utils/format'; +import * as paceUtils from '@/utils/paces'; +import * as raceUtils from '@/utils/races'; +import { DISTANCE_UNITS, convertDistance, getDefaultDistanceUnit } from '@/utils/units'; /** * Format a distance/time result as a key/value result @@ -9,22 +9,22 @@ import unitUtils from '@/utils/units'; * @param {String} defaultUnitSystem The default unit system (imperial or metric) * @returns {Object} The key/value result */ -function formatDistTimeResult(result, defaultUnitSystem) { +export function formatDistTimeResult(result, defaultUnitSystem) { // Calculate numerical pace - const pace = result.time / unitUtils.convertDistance(result.distanceValue, result.distanceUnit, - unitUtils.getDefaultDistanceUnit(defaultUnitSystem)); + const pace = result.time / convertDistance(result.distanceValue, result.distanceUnit, + getDefaultDistanceUnit(defaultUnitSystem)); return { // Convert distance to key string - key: formatUtils.formatNumber(result.distanceValue, 0, 2, result.result === 'distance') + ' ' - + unitUtils.DISTANCE_UNITS[result.distanceUnit].symbol, + key: formatNumber(result.distanceValue, 0, 2, result.result === 'distance') + ' ' + + DISTANCE_UNITS[result.distanceUnit].symbol, // Convert time to time string - value: formatUtils.formatDuration(result.time, 3, 2, result.result === 'time'), + value: formatDuration(result.time, 3, 2, result.result === 'time'), // Convert pace to pace string - pace: formatUtils.formatDuration(pace, 3, 0, true) + ' / ' - + unitUtils.DISTANCE_UNITS[unitUtils.getDefaultDistanceUnit(defaultUnitSystem)].symbol, + pace: formatDuration(pace, 3, 0, true) + ' / ' + + DISTANCE_UNITS[getDefaultDistanceUnit(defaultUnitSystem)].symbol, // Convert dist/time result to key/value result: result.result === 'time' ? 'value' : 'key', @@ -41,7 +41,7 @@ function formatDistTimeResult(result, defaultUnitSystem) { * @param {String} defaultUnitSystem The default unit system (imperial or metric) * @returns {Object} The result */ -function calculatePaceResults(input, target, defaultUnitSystem) { +export function calculatePaceResults(input, target, defaultUnitSystem) { const result = { distanceValue: target.distanceValue, distanceUnit: target.distanceUnit, @@ -49,12 +49,12 @@ function calculatePaceResults(input, target, defaultUnitSystem) { result: target.type === 'distance' ? 'time' : 'distance', }; - const d1 = unitUtils.convertDistance(input.distanceValue, input.distanceUnit, 'meters'); + const d1 = convertDistance(input.distanceValue, input.distanceUnit, 'meters'); // Add missing value to result if (target.type === 'distance') { // Convert target distance into meters - const d2 = unitUtils.convertDistance(target.distanceValue, target.distanceUnit, 'meters'); + const d2 = convertDistance(target.distanceValue, target.distanceUnit, 'meters'); // Calculate time to travel distance at input pace result.time = paceUtils.calculateTime(d1, input.time, d2); @@ -63,8 +63,8 @@ function calculatePaceResults(input, target, defaultUnitSystem) { const d2 = paceUtils.calculateDistance(input.time, d1, target.time); // Convert output distance into default distance unit - const units = unitUtils.getDefaultDistanceUnit(defaultUnitSystem); - result.distanceValue = unitUtils.convertDistance(d2, 'meters', units); + const units = getDefaultDistanceUnit(defaultUnitSystem); + result.distanceValue = convertDistance(d2, 'meters', units); result.distanceUnit = units; } @@ -80,7 +80,7 @@ function calculatePaceResults(input, target, defaultUnitSystem) { * @param {String} defaultUnitSystem The default unit system (imperial or metric) * @returns {Object} The result */ -function calculateRaceResults(input, target, options, defaultUnitSystem) { +export function calculateRaceResults(input, target, options, defaultUnitSystem) { const result = { distanceValue: target.distanceValue, distanceUnit: target.distanceUnit, @@ -88,12 +88,12 @@ function calculateRaceResults(input, target, options, defaultUnitSystem) { result: target.type === 'distance' ? 'time' : 'distance', }; - const d1 = unitUtils.convertDistance(input.distanceValue, input.distanceUnit, 'meters'); + const d1 = convertDistance(input.distanceValue, input.distanceUnit, 'meters'); // Add missing value to result if (target.type === 'distance') { // Convert target distance into meters - const d2 = unitUtils.convertDistance(target.distanceValue, target.distanceUnit, 'meters'); + const d2 = convertDistance(target.distanceValue, target.distanceUnit, 'meters'); // Get prediction result.time = raceUtils.predictTime(d1, input.time, d2, options.model, options.riegelExponent); @@ -103,12 +103,12 @@ function calculateRaceResults(input, target, options, defaultUnitSystem) { options.riegelExponent); // Convert output distance into default distance unit - distance = unitUtils.convertDistance(distance, 'meters', - unitUtils.getDefaultDistanceUnit(defaultUnitSystem)); + distance = convertDistance(distance, 'meters', + getDefaultDistanceUnit(defaultUnitSystem)); // Update result result.distanceValue = distance; - result.distanceUnit = unitUtils.getDefaultDistanceUnit(defaultUnitSystem); + result.distanceUnit = getDefaultDistanceUnit(defaultUnitSystem); } // Return result @@ -120,8 +120,8 @@ function calculateRaceResults(input, target, options, defaultUnitSystem) { * @param {Object} input The input race * @returns {Object} The race statistics */ -function calculateRaceStats(input) { - const d1 = unitUtils.convertDistance(input.distanceValue, input.distanceUnit, 'meters'); +export function calculateRaceStats(input) { + const d1 = convertDistance(input.distanceValue, input.distanceUnit, 'meters'); return { purdyPoints: raceUtils.getPurdyPoints(d1, input.time), @@ -130,9 +130,3 @@ function calculateRaceStats(input) { vo2MaxPercentage: raceUtils.getVO2Percentage(input.time) * 100, } } - -export default { - calculatePaceResults, - calculateRaceResults, - calculateRaceStats, -}; diff --git a/src/utils/format.js b/src/utils/format.js @@ -6,7 +6,7 @@ * @param {Boolean} extraDigits Whether to show extra zeros after the decimal point * @returns {String} The formatted value */ -function formatNumber(value, minPadding = 0, maxDigits = 2, extraDigits = true) { +export function formatNumber(value, minPadding = 0, maxDigits = 2, extraDigits = true) { // Initialize result let result = ''; @@ -51,7 +51,7 @@ function formatNumber(value, minPadding = 0, maxDigits = 2, extraDigits = true) * @param {Boolean} extraDigits Whether to show extra zeros after the decimal point * @returns {String} The formatted value */ -function formatDuration(value, minPadding = 6, maxDigits = 2, extraDigits = true) { +export function formatDuration(value, minPadding = 6, maxDigits = 2, extraDigits = true) { // Check if value is NaN if (Number.isNaN(value)) { return 'NaN'; @@ -97,8 +97,3 @@ function formatDuration(value, minPadding = 6, maxDigits = 2, extraDigits = true // Return result return result; } - -export default { - formatNumber, - formatDuration, -}; diff --git a/src/utils/paces.js b/src/utils/paces.js @@ -5,7 +5,7 @@ * @param {Number} d2 The output distance (in the same unit as d1) * @returns {Number} The output time (in seconds) */ -function calculateTime(d1, t1, d2) { +export function calculateTime(d1, t1, d2) { return (t1 / d1) * d2 } @@ -16,11 +16,6 @@ function calculateTime(d1, t1, d2) { * @param {Number} t2 The output time (in seconds) * @returns {Number} The output distance (in the same unit as d1) */ -function calculateDistance(t1, d1, t2) { +export function calculateDistance(t1, d1, t2) { return (d1 / t1) * t2 } - -export default { - calculateTime, - calculateDistance, -}; diff --git a/src/utils/races.js b/src/utils/races.js @@ -416,7 +416,7 @@ const AverageModel = { * @param {String} model The race prediction model to use * @param {Number} c The value of the exponent in Pete Riegel's Model */ -function predictTime(d1, t1, d2, model='AverageModel', c=1.06) { +export function predictTime(d1, t1, d2, model='AverageModel', c=1.06) { switch (model) { case 'AverageModel': return AverageModel.predictTime(d1, t1, d2, c); @@ -439,7 +439,7 @@ function predictTime(d1, t1, d2, model='AverageModel', c=1.06) { * @param {String} model The race prediction model to use * @param {Number} c The value of the exponent in Pete Riegel's Model */ -function predictDistance(t1, d1, t2, model='AverageModel', c=1.06) { +export function predictDistance(t1, d1, t2, model='AverageModel', c=1.06) { switch (model) { default: case 'AverageModel': @@ -455,11 +455,7 @@ function predictDistance(t1, d1, t2, model='AverageModel', c=1.06) { } } -export default { - predictTime, - predictDistance, - getPurdyPoints: PurdyPointsModel.getPurdyPoints, - getVO2: VO2MaxModel.getVO2, - getVO2Percentage: VO2MaxModel.getVO2Percentage, - getVO2Max: VO2MaxModel.getVO2Max, -}; +export const getPurdyPoints = PurdyPointsModel.getPurdyPoints; +export const getVO2 = VO2MaxModel.getVO2; +export const getVO2Percentage = VO2MaxModel.getVO2Percentage; +export const getVO2Max = VO2MaxModel.getVO2Max; diff --git a/src/utils/targets.js b/src/utils/targets.js @@ -1,22 +1,22 @@ -import unitUtils from '@/utils/units'; +import { convertDistance } from '@/utils/units'; /** * Sort an array of targets * @param {Array} targets The array of targets * @returns {Array} The sorted targets */ -function sort(targets) { +export function sort(targets) { return [ ...targets.filter((item) => item.type === 'distance') - .sort((a, b) => unitUtils.convertDistance(a.distanceValue, a.distanceUnit, 'meters') - - unitUtils.convertDistance(b.distanceValue, b.distanceUnit, 'meters')), + .sort((a, b) => convertDistance(a.distanceValue, a.distanceUnit, 'meters') + - convertDistance(b.distanceValue, b.distanceUnit, 'meters')), ...targets.filter((item) => item.type === 'time') .sort((a, b) => a.time - b.time), ]; } -const defaultTargetSets = { +export const defaultTargetSets = { '_pace_targets': { name: 'Common Pace Targets', targets: sort([ @@ -88,8 +88,3 @@ const defaultTargetSets = { ], }, }; - -export default { - sort, - defaultTargetSets, -}; diff --git a/src/utils/units.js b/src/utils/units.js @@ -1,7 +1,7 @@ /** * The time units */ -const TIME_UNITS = { +export const TIME_UNITS = { seconds: { name: 'Seconds', symbol: 's', @@ -22,7 +22,7 @@ const TIME_UNITS = { /** * The distance units */ -const DISTANCE_UNITS = { +export const DISTANCE_UNITS = { meters: { name: 'Meters', symbol: 'm', @@ -53,7 +53,7 @@ const DISTANCE_UNITS = { /** * The speed units */ -const SPEED_UNITS = { +export const SPEED_UNITS = { meters_per_second: { name: 'Meters per Second', symbol: 'm/s', @@ -74,7 +74,7 @@ const SPEED_UNITS = { /** * The value of each pace unit in seconds per meter */ -const PACE_UNITS = { +export const PACE_UNITS = { seconds_per_meter: { name: 'Seconds per Meter', symbol: 's/m', @@ -99,7 +99,7 @@ const PACE_UNITS = { * @param {String} outputUnit The unit of the output * @returns {Number} The output */ -function convertTime(inputValue, inputUnit, outputUnit) { +export function convertTime(inputValue, inputUnit, outputUnit) { return (inputValue * TIME_UNITS[inputUnit].value) / TIME_UNITS[outputUnit].value; } @@ -110,7 +110,7 @@ function convertTime(inputValue, inputUnit, outputUnit) { * @param {String} outputUnit The unit of the output * @returns {Number} The output */ -function convertDistance(inputValue, inputUnit, outputUnit) { +export function convertDistance(inputValue, inputUnit, outputUnit) { return (inputValue * DISTANCE_UNITS[inputUnit].value) / DISTANCE_UNITS[outputUnit].value; } @@ -121,7 +121,7 @@ function convertDistance(inputValue, inputUnit, outputUnit) { * @param {String} outputUnit The unit of the output * @returns {Number} The output */ -function convertSpeed(inputValue, inputUnit, outputUnit) { +export function convertSpeed(inputValue, inputUnit, outputUnit) { return (inputValue * SPEED_UNITS[inputUnit].value) / SPEED_UNITS[outputUnit].value; } @@ -132,7 +132,7 @@ function convertSpeed(inputValue, inputUnit, outputUnit) { * @param {String} outputUnit The unit of the output * @returns {Number} The output */ -function convertPace(inputValue, inputUnit, outputUnit) { +export function convertPace(inputValue, inputUnit, outputUnit) { return (inputValue * PACE_UNITS[inputUnit].value) / PACE_UNITS[outputUnit].value; } @@ -143,7 +143,7 @@ function convertPace(inputValue, inputUnit, outputUnit) { * @param {String} outputUnit The unit of the output * @returns {Number} The output */ -function convertSpeedPace(inputValue, inputUnit, outputUnit) { +export function convertSpeedPace(inputValue, inputUnit, outputUnit) { // Calculate input speed let speed; if (inputUnit in PACE_UNITS) { @@ -163,7 +163,7 @@ function convertSpeedPace(inputValue, inputUnit, outputUnit) { * Detect the user's default unit system * @returns {String} The default unit system */ -function detectDefaultUnitSystem() { +export function detectDefaultUnitSystem() { const language = (navigator.language || navigator.userLanguage).toLowerCase(); if (language.endsWith('-us') || language.endsWith('-mm')) { return 'imperial'; @@ -176,7 +176,7 @@ function detectDefaultUnitSystem() { * @param {String} unitSystem The unit system * @returns {String} The default distance unit */ -function getDefaultDistanceUnit(unitSystem) { +export function getDefaultDistanceUnit(unitSystem) { return unitSystem === 'metric' ? 'kilometers' : 'miles'; } @@ -185,7 +185,7 @@ function getDefaultDistanceUnit(unitSystem) { * @param {String} unitSystem The unit system * @returns {String} The default speed unit */ -function getDefaultSpeedUnit(unitSystem) { +export function getDefaultSpeedUnit(unitSystem) { return unitSystem === 'metric' ? 'kilometers_per_hour' : 'miles_per_hour'; } @@ -194,24 +194,6 @@ function getDefaultSpeedUnit(unitSystem) { * @param {String} unitSystem The unit system * @returns {String} The default pace unit */ -function getDefaultPaceUnit(unitSystem) { +export function getDefaultPaceUnit(unitSystem) { return unitSystem === 'metric' ? 'seconds_per_kilometer' : 'seconds_per_mile'; } - -export default { - TIME_UNITS, - DISTANCE_UNITS, - SPEED_UNITS, - PACE_UNITS, - - convertTime, - convertDistance, - convertSpeed, - convertPace, - convertSpeedPace, - - detectDefaultUnitSystem, - getDefaultDistanceUnit, - getDefaultSpeedUnit, - getDefaultPaceUnit, -}; diff --git a/src/views/PaceCalculator.vue b/src/views/PaceCalculator.vue @@ -25,15 +25,15 @@ <h2>Equivalent Paces</h2> <single-output-table class="output" :calculate-result="x => - calcUtils.calculatePaceResults(input, x, defaultUnitSystem)" + calculatePaceResults(input, x, defaultUnitSystem)" :targets="targetSets[selectedTargetSet] ? targetSets[selectedTargetSet].targets : []"/> </div> </template> <script setup> -import calcUtils from '@/utils/calculators'; -import targetUtils from '@/utils/targets'; -import unitUtils from '@/utils/units'; +import { calculatePaceResults } from '@/utils/calculators'; +import { defaultTargetSets } from '@/utils/targets'; +import { detectDefaultUnitSystem } from '@/utils/units'; import PaceInput from '@/components/PaceInput.vue'; import SingleOutputTable from '@/components/SingleOutputTable.vue'; @@ -53,7 +53,7 @@ const input = useStorage('pace-calculator-input', { /** * The default unit system */ -const defaultUnitSystem = useStorage('default-unit-system', unitUtils.detectDefaultUnitSystem()); +const defaultUnitSystem = useStorage('default-unit-system', detectDefaultUnitSystem()); /** * The current selected target set @@ -64,7 +64,7 @@ const selectedTargetSet = useStorage('pace-calculator-target-set', '_pace_target * The target sets */ const targetSets = useStorage('pace-calculator-target-sets', { - _pace_targets: targetUtils.defaultTargetSets._pace_targets + _pace_targets: defaultTargetSets._pace_targets }); </script> diff --git a/src/views/RaceCalculator.vue b/src/views/RaceCalculator.vue @@ -10,14 +10,14 @@ <h2>Race Statistics</h2> </summary> <div> - Purdy Points: <b>{{ formatUtils.formatNumber(raceStats.purdyPoints, 0, 1, true) }}</b> + Purdy Points: <b>{{ formatNumber(raceStats.purdyPoints, 0, 1, true) }}</b> </div> <div> - V&#775;O&#8322;: <b>{{ formatUtils.formatNumber(raceStats.vo2, 0, 1, true) }}</b> ml/kg/min - (<b>{{ formatUtils.formatNumber(raceStats.vo2MaxPercentage, 0, 1, true) }}%</b> of max) + V&#775;O&#8322;: <b>{{ formatNumber(raceStats.vo2, 0, 1, true) }}</b> ml/kg/min + (<b>{{ formatNumber(raceStats.vo2MaxPercentage, 0, 1, true) }}%</b> of max) </div> <div> - V&#775;O&#8322; Max: <b>{{ formatUtils.formatNumber(raceStats.vo2Max, 0, 1, true) }}</b> + V&#775;O&#8322; Max: <b>{{ formatNumber(raceStats.vo2Max, 0, 1, true) }}</b> ml/kg/min </div> </details> @@ -43,7 +43,7 @@ <h2>Equivalent Race Results</h2> <single-output-table class="output" :default-unit-system="defaultUnitSystem" show-pace - :calculate-result="x => calcUtils.calculateRaceResults(input, x, options, defaultUnitSystem)" + :calculate-result="x => calculateRaceResults(input, x, options, defaultUnitSystem)" :targets="targetSets[selectedTargetSet] ? targetSets[selectedTargetSet].targets : []"/> </div> </template> @@ -51,10 +51,10 @@ <script setup> import { computed } from 'vue'; -import calcUtils from '@/utils/calculators'; -import formatUtils from '@/utils/format'; -import targetUtils from '@/utils/targets'; -import unitUtils from '@/utils/units'; +import { calculateRaceResults, calculateRaceStats } from '@/utils/calculators'; +import { formatNumber } from '@/utils/format'; +import { defaultTargetSets } from '@/utils/targets'; +import { detectDefaultUnitSystem } from '@/utils/units'; import PaceInput from '@/components/PaceInput.vue'; import RaceOptions from '@/components/RaceOptions.vue'; @@ -75,7 +75,7 @@ const input = useStorage('race-calculator-input', { /** * The default unit system */ -const defaultUnitSystem = useStorage('default-unit-system', unitUtils.detectDefaultUnitSystem()); +const defaultUnitSystem = useStorage('default-unit-system', detectDefaultUnitSystem()); /** * The race prediction options @@ -94,13 +94,13 @@ const selectedTargetSet = useStorage('race-calculator-target-set', '_race_target * The target sets */ let targetSets = useStorage('race-calculator-target-sets', { - _race_targets: targetUtils.defaultTargetSets._race_targets + _race_targets: defaultTargetSets._race_targets }); /** * The statistics for the current input race */ -const raceStats = computed(() => calcUtils.calculateRaceStats(input.value)); +const raceStats = computed(() => calculateRaceStats(input.value)); </script> <style scoped> diff --git a/src/views/SplitCalculator.vue b/src/views/SplitCalculator.vue @@ -23,8 +23,8 @@ <script setup> import { computed } from 'vue'; -import targetUtils from '@/utils/targets'; -import unitUtils from '@/utils/units'; +import { defaultTargetSets } from '@/utils/targets'; +import { detectDefaultUnitSystem } from '@/utils/units'; import SplitOutputTable from '@/components/SplitOutputTable.vue'; import TargetSetSelector from '@/components/TargetSetSelector.vue'; @@ -34,7 +34,7 @@ import useStorage from '@/composables/useStorage'; /** * The default unit system */ -const defaultUnitSystem = useStorage('default-unit-system', unitUtils.detectDefaultUnitSystem()); +const defaultUnitSystem = useStorage('default-unit-system', detectDefaultUnitSystem()); /** * The current selected target set @@ -45,7 +45,7 @@ const selectedTargetSet = useStorage('split-calculator-target-set', '_split_targ * The default output targets */ const targetSets = useStorage('split-calculator-target-sets', { - _split_targets: targetUtils.defaultTargetSets._split_targets + _split_targets: defaultTargetSets._split_targets }); /** diff --git a/src/views/UnitCalculator.vue b/src/views/UnitCalculator.vue @@ -20,10 +20,10 @@ <span class="equals"> = </span> <span v-if="getUnitType(input.outputUnit) === 'time'" class="output-value" aria-label="Output value"> - {{ formatUtils.formatDuration(outputValue, 6, 3, true) }} + {{ formatDuration(outputValue, 6, 3, true) }} </span> <span v-else class="output-value" aria-label="Output value"> - {{ formatUtils.formatNumber(outputValue, 0, 3, true) }} + {{ formatNumber(outputValue, 0, 3, true) }} </span> <select v-model="input.outputUnit" class="output-units" aria-label="Output units"> @@ -37,8 +37,9 @@ <script setup> import { computed, ref } from 'vue'; -import formatUtils from '@/utils/format'; -import unitUtils from '@/utils/units'; +import { formatDuration, formatNumber } from '@/utils/format'; +import { DISTANCE_UNITS, TIME_UNITS, SPEED_UNITS, PACE_UNITS, convertDistance, convertTime, +convertSpeedPace } from '@/utils/units'; import DecimalInput from '@/components/DecimalInput.vue'; import TimeInput from '@/components/TimeInput.vue'; @@ -89,11 +90,11 @@ const input = computed({ const units = computed(() => { switch (category.value) { case 'distance': { - return unitUtils.DISTANCE_UNITS; + return DISTANCE_UNITS; } case 'time': { return { - ...unitUtils.TIME_UNITS, + ...TIME_UNITS, 'hh:mm:ss': { name: 'hh:mm:ss', symbol: '', @@ -102,7 +103,7 @@ const units = computed(() => { }; } case 'speed_and_pace': { - return { ...unitUtils.PACE_UNITS, ...unitUtils.SPEED_UNITS }; + return { ...PACE_UNITS, ...SPEED_UNITS }; } default: { return {}; @@ -116,7 +117,7 @@ const units = computed(() => { const outputValue = computed(() => { switch (category.value) { case 'distance': { - return unitUtils.convertDistance(input.value.inputValue, input.value.inputUnit, + return convertDistance(input.value.inputValue, input.value.inputUnit, input.value.outputUnit); } case 'time': { @@ -125,10 +126,10 @@ const outputValue = computed(() => { const realOutput = input.value.outputUnit === 'hh:mm:ss' ? 'seconds' : input.value.outputUnit; // Calculate conversion - return unitUtils.convertTime(input.value.inputValue, realInput, realOutput); + return convertTime(input.value.inputValue, realInput, realOutput); } case 'speed_and_pace': { - return unitUtils.convertSpeedPace(input.value.inputValue, input.value.inputUnit, + return convertSpeedPace(input.value.inputValue, input.value.inputUnit, input.value.outputUnit); } default: { @@ -143,10 +144,10 @@ const outputValue = computed(() => { * @returns {String} The type ('decimal' or 'time') */ function getUnitType(unit) { - if (unit in unitUtils.DISTANCE_UNITS) { + if (unit in DISTANCE_UNITS) { return 'decimal'; } - if (unit in unitUtils.TIME_UNITS) { + if (unit in TIME_UNITS) { return 'decimal'; } if (unit === 'hh:mm:ss') { diff --git a/tests/e2e/cross-calculator.spec.js b/tests/e2e/cross-calculator.spec.js @@ -1,4 +1,4 @@ -const { test, expect } = require('@playwright/test'); +import { test, expect } from '@playwright/test'; test('Save and update state when navigating between calculators', async ({ page }) => { // Go to pace calculator diff --git a/tests/e2e/pace-calculator.spec.js b/tests/e2e/pace-calculator.spec.js @@ -1,4 +1,4 @@ -const { test, expect } = require('@playwright/test'); +import { test, expect } from '@playwright/test'; test('Basic usage', async ({ page }) => { await page.goto('/'); diff --git a/tests/e2e/race-calculator.spec.js b/tests/e2e/race-calculator.spec.js @@ -1,4 +1,4 @@ -const { test, expect } = require('@playwright/test'); +import { test, expect } from '@playwright/test'; test('Basic usage', async ({ page }) => { // Go to race calculator diff --git a/tests/e2e/split-calculator.spec.js b/tests/e2e/split-calculator.spec.js @@ -1,4 +1,4 @@ -const { test, expect } = require('@playwright/test'); +import { test, expect } from '@playwright/test'; test('Basic usage', async ({ page }) => { // Go to split calculator diff --git a/tests/e2e/unit-calculator.spec.js b/tests/e2e/unit-calculator.spec.js @@ -1,4 +1,4 @@ -const { test, expect } = require('@playwright/test'); +import { test, expect } from '@playwright/test'; test('Basic usage', async ({ page }) => { // Go to unit calculator diff --git a/tests/unit/utils/calculators.spec.js b/tests/unit/utils/calculators.spec.js @@ -1,5 +1,5 @@ import { test, expect } from 'vitest'; -import calculatorUtils from '@/utils/calculators'; +import * as calculatorUtils from '@/utils/calculators'; test('should correctly calculate pace times', () => { const input = { diff --git a/tests/unit/utils/format.spec.js b/tests/unit/utils/format.spec.js @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest'; -import formatUtils from '@/utils/format'; +import * as formatUtils from '@/utils/format'; describe('formatNumber method', () => { test('should correctly format number when padding is not 0', () => { diff --git a/tests/unit/utils/paces.spec.js b/tests/unit/utils/paces.spec.js @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest'; -import paces from '@/utils/paces'; +import * as paces from '@/utils/paces'; describe('calculateTime method', () => { test('1 meters in 3 seconds should equal 2 meters in 6 seconds', () => { diff --git a/tests/unit/utils/races.spec.js b/tests/unit/utils/races.spec.js @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest'; -import raceUtils from '@/utils/races'; +import * as raceUtils from '@/utils/races'; describe('predictTime method', () => { describe('PredictTime method', () => { diff --git a/tests/unit/utils/targets.spec.js b/tests/unit/utils/targets.spec.js @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest'; -import targets from '@/utils/targets'; +import * as targets from '@/utils/targets'; describe('sort method', () => { test('should correctly sort targets', () => { diff --git a/tests/unit/utils/units.spec.js b/tests/unit/utils/units.spec.js @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest'; -import units from '@/utils/units'; +import * as units from '@/utils/units'; describe('convertTime method', () => { test('90 seconds should equal 1.5 minutes', () => { diff --git a/tests/unit/views/PaceCalculator.spec.js b/tests/unit/views/PaceCalculator.spec.js @@ -1,7 +1,7 @@ import { beforeEach, test, expect } from 'vitest'; import { shallowMount } from '@vue/test-utils'; import PaceCalculator from '@/views/PaceCalculator.vue'; -import targetUtils from '@/utils/targets'; +import { defaultTargetSets } from '@/utils/targets'; beforeEach(() => { localStorage.clear(); @@ -89,7 +89,7 @@ test('should correctly handle null target set', async () => { .setValue('_pace_targets', 'selectedTargetSet'); // Assert valid targets passed to SingleOutputTable component - const paceTargets = targetUtils.defaultTargetSets._pace_targets.targets; + const paceTargets = defaultTargetSets._pace_targets.targets; expect(wrapper.findComponent({ name: 'single-output-table' }).vm.targets) .to.deep.equal(paceTargets); }); diff --git a/tests/unit/views/RaceCalculator.spec.js b/tests/unit/views/RaceCalculator.spec.js @@ -1,7 +1,7 @@ import { beforeEach, test, expect } from 'vitest'; import { shallowMount } from '@vue/test-utils'; import RaceCalculator from '@/views/RaceCalculator.vue'; -import targetUtils from '@/utils/targets'; +import { defaultTargetSets } from '@/utils/targets'; beforeEach(() => { localStorage.clear(); @@ -95,7 +95,7 @@ test('should correctly handle null target set', async () => { .setValue('_race_targets', 'selectedTargetSet'); // Assert valid targets passed to SingleOutputTable component - const raceTargets = targetUtils.defaultTargetSets._race_targets.targets; + const raceTargets = defaultTargetSets._race_targets.targets; expect(wrapper.findComponent({ name: 'single-output-table' }).vm.targets) .to.deep.equal(raceTargets); });