@kaiord/core / extractWorkout
Function: extractWorkout()
extractWorkout(
krd):object
Defined in: packages/core/src/domain/validation/extract-workout.ts:17
Extracts and validates the structured workout from a KRD object.
Checks that the KRD type is "structured_workout" and validates the workout in extensions.structured_workout against workoutSchema.
Parameters
krd
KRD object to extract workout from
events?
object[] = ...
extensions?
Record<string, unknown> = ...
laps?
object[] = ...
metadata
{ created: string; manufacturer?: string; product?: string; serialNumber?: string; sport: string; subSport?: string; } = krdMetadataSchema
metadata.created
string = ...
metadata.manufacturer?
string = ...
metadata.product?
string = ...
metadata.serialNumber?
string = ...
metadata.sport
string = ...
See
sportSchema for known sport values. Accepts custom strings for forward compatibility.
metadata.subSport?
string = ...
records?
object[] = ...
sessions?
object[] = ...
type
"structured_workout" | "recorded_activity" | "course" = ...
version
string = ...
Returns
object
Validated Workout object
extensions?
optionalextensions?:Record<string,unknown>
name?
optionalname?:string
poolLength?
optionalpoolLength?:number
poolLengthUnit?
optionalpoolLengthUnit?:"meters"
sport
sport:
"cycling"|"running"|"swimming"|"generic"=sportSchema
steps
steps: ({
duration: {seconds:number;type:"time"; } | {meters:number;type:"distance"; } | {bpm:number;type:"heart_rate_less_than"; } | {bpm:number;repeatFrom:number;type:"repeat_until_heart_rate_greater_than"; } | {calories:number;type:"calories"; } | {type:"power_less_than";watts:number; } | {type:"power_greater_than";watts:number; } | {repeatFrom:number;seconds:number;type:"repeat_until_time"; } | {meters:number;repeatFrom:number;type:"repeat_until_distance"; } | {calories:number;repeatFrom:number;type:"repeat_until_calories"; } | {bpm:number;repeatFrom:number;type:"repeat_until_heart_rate_less_than"; } | {repeatFrom:number;type:"repeat_until_power_less_than";watts:number; } | {repeatFrom:number;type:"repeat_until_power_greater_than";watts:number; } | {type:"open"; };durationType:"time"|"distance"|"heart_rate_less_than"|"repeat_until_heart_rate_greater_than"|"calories"|"power_less_than"|"power_greater_than"|"repeat_until_time"|"repeat_until_distance"|"repeat_until_calories"|"repeat_until_heart_rate_less_than"|"repeat_until_power_less_than"|"repeat_until_power_greater_than"|"open";equipment?:"none"|"swim_fins"|"swim_kickboard"|"swim_paddles"|"swim_pull_buoy"|"swim_snorkel";extensions?:Record<string,unknown>;intensity?:"warmup"|"active"|"cooldown"|"rest"|"recovery"|"interval"|"other";name?:string;notes?:string;stepIndex:number;target: {type:"power";value: {unit:"watts";value:number; } | {unit:"percent_ftp";value:number; } | {unit:"zone";value:number; } | {max:number;min:number;unit:"range"; }; } | {type:"heart_rate";value: {unit:"bpm";value:number; } | {unit:"zone";value:number; } | {unit:"percent_max";value:number; } | {max:number;min:number;unit:"range"; }; } | {type:"cadence";value: {unit:"rpm";value:number; } | {max:number;min:number;unit:"range"; }; } | {type:"pace";value: {unit:"mps";value:number; } | {unit:"zone";value:number; } | {max:number;min:number;unit:"range"; }; } | {type:"stroke_type";value: {unit:"swim_stroke";value:number; }; } | {type:"open"; };targetType:"cadence"|"power"|"open"|"heart_rate"|"pace"|"stroke_type"; } | {id?:string;repeatCount:number;steps:object[]; })[]
subSport?
optionalsubSport?:"generic"|"treadmill"|"street"|"trail"|"track"|"spin"|"indoor_cycling"|"road"|"mountain"|"downhill"|"recumbent"|"cyclocross"|"hand_cycling"|"track_cycling"|"indoor_rowing"|"elliptical"|"stair_climbing"|"lap_swimming"|"open_water"|"flexibility_training"|"strength_training"|"warm_up"|"match"|"exercise"|"challenge"|"indoor_skiing"|"cardio_training"|"indoor_walking"|"e_bike_fitness"|"bmx"|"casual_walking"|"speed_walking"|"bike_to_run_transition"|"run_to_bike_transition"|"swim_to_bike_transition"|"atv"|"motocross"|"backcountry"|"resort"|"rc_drone"|"wingsuit"|"whitewater"|"skate_skiing"|"yoga"|"pilates"|"indoor_running"|"gravel_cycling"|"e_bike_mountain"|"commuting"|"mixed_surface"|"navigate"|"track_me"|"map"|"single_gas_diving"|"multi_gas_diving"|"gauge_diving"|"apnea_diving"|"apnea_hunting"|"virtual_activity"|"obstacle"|"all"
Throws
If KRD is not a structured workout or workout is invalid