@sports-alliance/sports-lib
Version:
A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc
109 lines (108 loc) • 5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStreamDerivationRules = getStreamDerivationRules;
exports.getStreamDerivationRule = getStreamDerivationRule;
exports.getDependencyTypesForResolution = getDependencyTypesForResolution;
exports.canDeriveStreamType = canDeriveStreamType;
const data_altitude_1 = require("../data/data.altitude");
const data_altitude_smooth_1 = require("../data/data.altitude-smooth");
const data_distance_1 = require("../data/data.distance");
const data_gnss_distance_1 = require("../data/data.gnss-distance");
const data_grade_1 = require("../data/data.grade");
const data_grade_adjusted_pace_1 = require("../data/data.grade-adjusted-pace");
const data_grade_adjusted_speed_1 = require("../data/data.grade-adjusted-speed");
const data_grade_smooth_1 = require("../data/data.grade-smooth");
const data_latitude_degrees_1 = require("../data/data.latitude-degrees");
const data_longitude_degrees_1 = require("../data/data.longitude-degrees");
const data_pace_1 = require("../data/data.pace");
const data_power_1 = require("../data/data.power");
const data_power_balance_left_1 = require("../data/data.power-balance-left");
const data_power_balance_right_1 = require("../data/data.power-balance-right");
const data_power_left_1 = require("../data/data.power-left");
const data_power_right_1 = require("../data/data.power-right");
const data_speed_1 = require("../data/data.speed");
const data_stance_time_balance_left_1 = require("../data/data-stance-time-balance-left");
const data_stance_time_balance_right_1 = require("../data/data-stance-time-balance-right");
const data_swim_pace_1 = require("../data/data.swim-pace");
const STREAM_DERIVATION_RULES = [
{
provides: data_altitude_smooth_1.DataAltitudeSmooth.type,
requiresAll: [data_altitude_1.DataAltitude.type]
},
{
provides: data_distance_1.DataDistance.type,
requiresAll: [data_latitude_degrees_1.DataLatitudeDegrees.type, data_longitude_degrees_1.DataLongitudeDegrees.type]
},
{
provides: data_gnss_distance_1.DataGNSSDistance.type,
requiresAll: [data_latitude_degrees_1.DataLatitudeDegrees.type, data_longitude_degrees_1.DataLongitudeDegrees.type]
},
{
provides: data_speed_1.DataSpeed.type,
requiresAll: [data_latitude_degrees_1.DataLatitudeDegrees.type, data_longitude_degrees_1.DataLongitudeDegrees.type]
},
{
provides: data_grade_1.DataGrade.type,
requiresAll: [data_distance_1.DataDistance.type],
requiresOneOf: [data_altitude_smooth_1.DataAltitudeSmooth.type, data_altitude_1.DataAltitude.type]
},
{
provides: data_grade_smooth_1.DataGradeSmooth.type,
requiresAll: [data_grade_1.DataGrade.type]
},
{
provides: data_grade_adjusted_speed_1.DataGradeAdjustedSpeed.type,
requiresAll: [data_speed_1.DataSpeed.type, data_grade_smooth_1.DataGradeSmooth.type]
},
{
provides: data_pace_1.DataPace.type,
requiresAll: [data_speed_1.DataSpeed.type]
},
{
provides: data_swim_pace_1.DataSwimPace.type,
requiresAll: [data_speed_1.DataSpeed.type]
},
{
provides: data_grade_adjusted_pace_1.DataGradeAdjustedPace.type,
requiresAll: [data_grade_adjusted_speed_1.DataGradeAdjustedSpeed.type]
},
{
provides: data_power_left_1.DataPowerLeft.type,
requiresAll: [data_power_1.DataPower.type, data_power_balance_left_1.DataPowerBalanceLeft.type]
},
{
provides: data_power_right_1.DataPowerRight.type,
requiresAll: [data_power_1.DataPower.type, data_power_balance_right_1.DataPowerBalanceRight.type]
},
{
provides: data_stance_time_balance_right_1.DataStanceTimeBalanceRight.type,
requiresAll: [data_stance_time_balance_left_1.DataStanceTimeBalanceLeft.type]
}
];
const STREAM_DERIVATION_RULES_BY_TARGET = new Map(STREAM_DERIVATION_RULES.map(rule => [rule.provides, rule]));
function getStreamDerivationRules() {
return [...STREAM_DERIVATION_RULES];
}
function getStreamDerivationRule(targetType) {
return STREAM_DERIVATION_RULES_BY_TARGET.get(targetType) || null;
}
/**
* Returns dependency types to add in dependency-closure resolution.
* For `requiresOneOf`, all candidates are returned as conservative dependencies.
*/
function getDependencyTypesForResolution(targetType) {
const rule = getStreamDerivationRule(targetType);
if (!rule) {
return [];
}
return [...new Set([...(rule.requiresAll || []), ...(rule.requiresOneOf || [])])];
}
function canDeriveStreamType(targetType, hasStreamType) {
const rule = getStreamDerivationRule(targetType);
if (!rule) {
return true;
}
const hasAll = (rule.requiresAll || []).every(requiredType => hasStreamType(requiredType));
const hasOneOf = !rule.requiresOneOf || rule.requiresOneOf.some(requiredType => hasStreamType(requiredType));
return hasAll && hasOneOf;
}