@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
82 lines (81 loc) • 3.54 kB
TypeScript
import { DataBare } from './data.bare';
import { DataJSONInterface } from './data.json.interface';
export declare const DURABILITY_PROTOCOL_VERSION: 1;
export declare const DURABILITY_PROTOCOL_ELIGIBILITY_THRESHOLDS: Readonly<{
minimumActivityDurationSeconds: number;
minimumQualifyingDurationSeconds: number;
minimumCoverageRatio: 0.6;
maximumOutputCoefficientOfVariation: 0.25;
maximumHardZoneRatio: 0.2;
minimumPoolComparableLengths: 24;
minimumPoolThirdLengths: 8;
}>;
export type DurabilityDiscipline = 'cycling' | 'running' | 'open-water-swimming' | 'pool-swimming';
export type DurabilityOutputSource = 'power' | 'grade-adjusted-speed' | 'speed' | 'pool-length-speed';
export type DurabilityOutputUnit = 'W' | 'm/s';
export type DurabilityEligibilityReason = 'eligible' | 'unsupported-activity' | 'missing-output' | 'missing-heart-rate' | 'insufficient-duration' | 'insufficient-coverage' | 'insufficient-halves' | 'too-variable' | 'too-intense' | 'unsupported-context';
export interface DurabilityContext {
poolLengthMeters: number;
stroke: string;
}
export interface DurabilityEligibility {
eligible: boolean;
reason: DurabilityEligibilityReason;
validSampleCount: number;
comparisonSegments: 'halves' | 'outer-thirds';
earlySampleCount: number;
lateSampleCount: number;
outputCoefficientOfVariation: number | null;
hardZoneRatio: number | null;
}
export interface AerobicDurabilityEvidence {
kind: 'aerobic-efficiency';
firstHalfEfficiency: number;
secondHalfEfficiency: number;
decouplingPercent: number;
firstHalfOutput: number;
secondHalfOutput: number;
outputRetentionPercent: number;
firstHalfHeartRateBpm: number;
secondHalfHeartRateBpm: number;
heartRateDriftBpm: number;
}
export interface PoolDurabilityEvidence {
kind: 'pool-consistency';
poolLengthMeters: number;
stroke: string;
comparableLengthCount: number;
firstPaceSecondsPer100m: number;
finalPaceSecondsPer100m: number;
paceRetentionPercent: number;
firstSwolf: number | null;
finalSwolf: number | null;
swolfChange: number | null;
}
export type DurabilityEvidence = AerobicDurabilityEvidence | PoolDurabilityEvidence;
export interface DurabilityEvidenceValue {
protocolVersion: typeof DURABILITY_PROTOCOL_VERSION;
/** Deterministic digest of every activity input used by protocol v1. */
sourceFingerprint: string;
discipline: DurabilityDiscipline;
outputSource: DurabilityOutputSource;
outputUnit: DurabilityOutputUnit;
context: DurabilityContext | null;
durationSeconds: number;
qualifyingDurationSeconds: number;
coverageRatio: number;
eligibility: DurabilityEligibility;
evidence: DurabilityEvidence | null;
}
/** Compact activity-level durability summary. Timelines and source streams are intentionally not persisted. */
export declare class DataDurabilityEvidence extends DataBare<DurabilityEvidenceValue> {
static type: string;
constructor(value: DurabilityEvidenceValue | unknown);
setValue(value: DurabilityEvidenceValue): this;
getDurabilityValue(): DurabilityEvidenceValue;
isValueTypeValid(value: unknown): boolean;
toJSON(): DataJSONInterface;
}
/** Returns a compact canonical value and strips every unknown field, including timelines. */
export declare function normalizeDurabilityEvidenceValue(value: unknown): DurabilityEvidenceValue | null;
export declare function normalizeComparablePoolStroke(value: unknown): string | null;