@kaiord/garmin 4.2.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +68 -34
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createConsoleLogger, createGarminParsingError, createWorkoutKRD, toText } from '@kaiord/core';
|
|
1
|
+
import { createConsoleLogger, createGarminParsingError, workoutSchema, createWorkoutKRD, toText } from '@kaiord/core';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
4
|
// src/index.ts
|
|
@@ -511,6 +511,45 @@ var mapKrdCadenceToGarmin = (value) => {
|
|
|
511
511
|
};
|
|
512
512
|
|
|
513
513
|
// src/adapters/converters/garmin-to-krd.converter.ts
|
|
514
|
+
var executableStepParseSchema = z.object({
|
|
515
|
+
type: z.literal("ExecutableStepDTO"),
|
|
516
|
+
stepType: z.object({ stepTypeKey: z.string() }).passthrough(),
|
|
517
|
+
endCondition: z.object({ conditionTypeKey: z.string() }).passthrough(),
|
|
518
|
+
endConditionValue: z.number(),
|
|
519
|
+
targetType: z.object({ workoutTargetTypeKey: z.string() }).passthrough(),
|
|
520
|
+
targetValueOne: z.number().nullable().optional(),
|
|
521
|
+
targetValueTwo: z.number().nullable().optional(),
|
|
522
|
+
zoneNumber: z.number().nullable().optional(),
|
|
523
|
+
secondaryTargetType: z.object({ workoutTargetTypeKey: z.string() }).passthrough().nullable().optional(),
|
|
524
|
+
secondaryTargetValueOne: z.number().nullable().optional(),
|
|
525
|
+
secondaryTargetValueTwo: z.number().nullable().optional(),
|
|
526
|
+
secondaryZoneNumber: z.number().nullable().optional(),
|
|
527
|
+
strokeType: z.object({
|
|
528
|
+
strokeTypeKey: z.string().nullable().optional(),
|
|
529
|
+
strokeTypeId: z.number().nullable().optional()
|
|
530
|
+
}).passthrough().nullable().optional(),
|
|
531
|
+
equipmentType: z.object({ equipmentTypeKey: z.string().nullable().optional() }).passthrough().nullable().optional()
|
|
532
|
+
}).passthrough();
|
|
533
|
+
var repeatGroupParseSchema = z.lazy(
|
|
534
|
+
() => z.object({
|
|
535
|
+
type: z.literal("RepeatGroupDTO"),
|
|
536
|
+
numberOfIterations: z.number(),
|
|
537
|
+
workoutSteps: z.array(workoutStepParseSchema)
|
|
538
|
+
}).passthrough()
|
|
539
|
+
);
|
|
540
|
+
var workoutStepParseSchema = z.lazy(
|
|
541
|
+
() => z.union([executableStepParseSchema, repeatGroupParseSchema])
|
|
542
|
+
);
|
|
543
|
+
var garminWorkoutParseSchema = z.object({
|
|
544
|
+
sportType: z.object({ sportTypeKey: z.string() }).passthrough().nullable().optional(),
|
|
545
|
+
workoutName: z.string().optional(),
|
|
546
|
+
workoutSegments: z.array(
|
|
547
|
+
z.object({
|
|
548
|
+
workoutSteps: z.array(workoutStepParseSchema).optional()
|
|
549
|
+
}).passthrough()
|
|
550
|
+
).optional(),
|
|
551
|
+
poolLength: z.number().nullable().optional()
|
|
552
|
+
});
|
|
514
553
|
var convertGarminToKRD = (gcnString, logger) => {
|
|
515
554
|
logger.info("Parsing Garmin Connect JSON");
|
|
516
555
|
let parsed;
|
|
@@ -519,12 +558,13 @@ var convertGarminToKRD = (gcnString, logger) => {
|
|
|
519
558
|
} catch (error) {
|
|
520
559
|
throw createGarminParsingError("Invalid JSON in GCN file", error);
|
|
521
560
|
}
|
|
522
|
-
|
|
523
|
-
|
|
561
|
+
const result = garminWorkoutParseSchema.safeParse(parsed);
|
|
562
|
+
if (!result.success) {
|
|
563
|
+
const issues = result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
|
|
564
|
+
throw createGarminParsingError(`Invalid GCN data: ${issues}`);
|
|
524
565
|
}
|
|
525
|
-
const gcn =
|
|
526
|
-
const
|
|
527
|
-
const sport = mapGarminSportToKrd(sportType?.sportTypeKey ?? "");
|
|
566
|
+
const gcn = result.data;
|
|
567
|
+
const sport = mapGarminSportToKrd(gcn.sportType?.sportTypeKey ?? "");
|
|
528
568
|
const workoutName = gcn.workoutName ?? "";
|
|
529
569
|
const segments = gcn.workoutSegments ?? [];
|
|
530
570
|
const steps = flattenSegmentsToSteps(segments, logger);
|
|
@@ -538,22 +578,15 @@ var convertGarminToKRD = (gcnString, logger) => {
|
|
|
538
578
|
return {
|
|
539
579
|
version: "1.0",
|
|
540
580
|
type: "structured_workout",
|
|
541
|
-
metadata: {
|
|
542
|
-
|
|
543
|
-
sport,
|
|
544
|
-
manufacturer: "garmin-connect"
|
|
545
|
-
},
|
|
546
|
-
extensions: {
|
|
547
|
-
structured_workout: workout
|
|
548
|
-
}
|
|
581
|
+
metadata: { created: now, sport, manufacturer: "garmin-connect" },
|
|
582
|
+
extensions: { structured_workout: workout }
|
|
549
583
|
};
|
|
550
584
|
};
|
|
551
585
|
var flattenSegmentsToSteps = (segments, logger) => {
|
|
552
586
|
const allSteps = [];
|
|
553
587
|
let stepIndex = 0;
|
|
554
588
|
for (const segment of segments) {
|
|
555
|
-
const
|
|
556
|
-
for (const step of workoutSteps) {
|
|
589
|
+
for (const step of segment.workoutSteps ?? []) {
|
|
557
590
|
if (step.type === "RepeatGroupDTO") {
|
|
558
591
|
const block = mapRepeatGroup(step, stepIndex, logger);
|
|
559
592
|
stepIndex += block.steps.length;
|
|
@@ -567,19 +600,18 @@ var flattenSegmentsToSteps = (segments, logger) => {
|
|
|
567
600
|
return allSteps;
|
|
568
601
|
};
|
|
569
602
|
var mapExecutableStep = (step, stepIndex) => {
|
|
570
|
-
const conditionKey = step.endCondition.conditionTypeKey;
|
|
571
603
|
const { durationType, duration } = mapConditionToDuration(
|
|
572
|
-
|
|
604
|
+
step.endCondition.conditionTypeKey,
|
|
573
605
|
step.endConditionValue
|
|
574
606
|
);
|
|
575
607
|
const { targetType, target } = resolveTarget(step);
|
|
576
608
|
const intensity = mapStepTypeToIntensity(step.stepType.stepTypeKey);
|
|
577
609
|
const equipment = mapGarminEquipmentToKrd(
|
|
578
|
-
step.equipmentType?.equipmentTypeKey
|
|
610
|
+
step.equipmentType?.equipmentTypeKey ?? null
|
|
579
611
|
);
|
|
580
612
|
const stroke = mapGarminStrokeToKrd(
|
|
581
|
-
step.strokeType?.strokeTypeKey,
|
|
582
|
-
step.strokeType?.strokeTypeId
|
|
613
|
+
step.strokeType?.strokeTypeKey ?? null,
|
|
614
|
+
step.strokeType?.strokeTypeId ?? 0
|
|
583
615
|
);
|
|
584
616
|
const result = {
|
|
585
617
|
stepIndex,
|
|
@@ -602,16 +634,16 @@ var mapExecutableStep = (step, stepIndex) => {
|
|
|
602
634
|
var resolveTarget = (step) => {
|
|
603
635
|
const primary = mapGarminTargetToKrd(
|
|
604
636
|
step.targetType.workoutTargetTypeKey,
|
|
605
|
-
step.targetValueOne,
|
|
606
|
-
step.targetValueTwo,
|
|
607
|
-
step.zoneNumber
|
|
637
|
+
step.targetValueOne ?? null,
|
|
638
|
+
step.targetValueTwo ?? null,
|
|
639
|
+
step.zoneNumber ?? null
|
|
608
640
|
);
|
|
609
641
|
if (step.secondaryTargetType && primary.targetType === "open") {
|
|
610
642
|
return mapGarminTargetToKrd(
|
|
611
643
|
step.secondaryTargetType.workoutTargetTypeKey,
|
|
612
|
-
step.secondaryTargetValueOne,
|
|
613
|
-
step.secondaryTargetValueTwo,
|
|
614
|
-
step.secondaryZoneNumber
|
|
644
|
+
step.secondaryTargetValueOne ?? null,
|
|
645
|
+
step.secondaryTargetValueTwo ?? null,
|
|
646
|
+
step.secondaryZoneNumber ?? null
|
|
615
647
|
);
|
|
616
648
|
}
|
|
617
649
|
return primary;
|
|
@@ -634,10 +666,7 @@ var mapRepeatGroup = (group, startIndex, logger) => {
|
|
|
634
666
|
}
|
|
635
667
|
}
|
|
636
668
|
}
|
|
637
|
-
return {
|
|
638
|
-
repeatCount: group.numberOfIterations,
|
|
639
|
-
steps
|
|
640
|
-
};
|
|
669
|
+
return { repeatCount: group.numberOfIterations, steps };
|
|
641
670
|
};
|
|
642
671
|
var addPoolLength = (gcn, workout) => {
|
|
643
672
|
const poolLength = gcn.poolLength;
|
|
@@ -690,7 +719,12 @@ var convertKRDToGarmin = (krd, logger) => {
|
|
|
690
719
|
var extractWorkout = (krd) => {
|
|
691
720
|
const ext = krd.extensions?.structured_workout;
|
|
692
721
|
if (!ext || typeof ext !== "object") return void 0;
|
|
693
|
-
|
|
722
|
+
const result = workoutSchema.safeParse(ext);
|
|
723
|
+
if (!result.success) {
|
|
724
|
+
const issues = result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
|
|
725
|
+
throw createGarminParsingError(`Invalid workout data: ${issues}`);
|
|
726
|
+
}
|
|
727
|
+
return result.data;
|
|
694
728
|
};
|
|
695
729
|
var isRepetitionBlock = (step) => "repeatCount" in step;
|
|
696
730
|
var STEP_TYPE_IDS = {
|
|
@@ -710,9 +744,9 @@ var STEP_TYPE_ORDER = {
|
|
|
710
744
|
var getStepTypeInfo = (intensity) => {
|
|
711
745
|
const key = mapIntensityToStepType(intensity);
|
|
712
746
|
return {
|
|
713
|
-
stepTypeId: STEP_TYPE_IDS[key]
|
|
747
|
+
stepTypeId: STEP_TYPE_IDS[key],
|
|
714
748
|
stepTypeKey: key,
|
|
715
|
-
displayOrder: STEP_TYPE_ORDER[key]
|
|
749
|
+
displayOrder: STEP_TYPE_ORDER[key]
|
|
716
750
|
};
|
|
717
751
|
};
|
|
718
752
|
var mapWorkoutStep = (step, counter) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/schemas/common/condition-type.schema.ts","../src/adapters/schemas/common/sport-type.schema.ts","../src/adapters/schemas/common/step-type.schema.ts","../src/adapters/schemas/common/target-type.schema.ts","../src/adapters/mappers/condition.mapper.ts","../src/adapters/mappers/equipment.mapper.ts","../src/adapters/mappers/intensity.mapper.ts","../src/adapters/mappers/sport.mapper.ts","../src/adapters/mappers/stroke.mapper.ts","../src/adapters/mappers/target.mapper.ts","../src/adapters/converters/garmin-to-krd.converter.ts","../src/adapters/garmin-reader.ts","../src/adapters/converters/krd-to-garmin.converter.ts","../src/adapters/garmin-writer.ts","../src/adapters/workout-to-garmin.ts","../src/index.ts"],"names":["z","createGarminParsingError","createGarminReader","createConsoleLogger","createGarminWriter"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nexport const ConditionTypeId = {\n LAP_BUTTON: 1,\n TIME: 2,\n DISTANCE: 3,\n CALORIES: 4,\n HEART_RATE: 5,\n POWER: 6,\n ITERATIONS: 7,\n FIXED_REST: 8,\n REPS: 10,\n} as const;\n\nexport const conditionTypeKeySchema = z.enum([\n \"lap.button\",\n \"time\",\n \"distance\",\n \"calories\",\n \"heart.rate\",\n \"power\",\n \"iterations\",\n \"fixed.rest\",\n \"reps\",\n]);\n\nexport const garminConditionTypeSchema = z.object({\n conditionTypeId: z.number().int().positive(),\n conditionTypeKey: conditionTypeKeySchema,\n displayOrder: z.number().int().nonnegative(),\n displayable: z.boolean(),\n});\n\nexport type GarminConditionType = z.infer<typeof garminConditionTypeSchema>;\n","import { z } from \"zod\";\n\nexport const SportTypeId = {\n RUNNING: 1,\n CYCLING: 2,\n HIKING: 3,\n SWIMMING: 4,\n STRENGTH_TRAINING: 5,\n CARDIO_TRAINING: 6,\n MULTI_SPORT: 10,\n} as const;\n\nexport const sportTypeKeySchema = z.enum([\n \"running\",\n \"cycling\",\n \"hiking\",\n \"swimming\",\n \"strength_training\",\n \"cardio_training\",\n \"multi_sport\",\n]);\n\nexport const garminSportTypeSchema = z.object({\n sportTypeId: z.number().int().positive(),\n sportTypeKey: sportTypeKeySchema,\n displayOrder: z.number().int().nonnegative().optional(),\n});\n\nexport type GarminSportType = z.infer<typeof garminSportTypeSchema>;\n","import { z } from \"zod\";\n\nexport const StepTypeId = {\n WARMUP: 1,\n COOLDOWN: 2,\n INTERVAL: 3,\n RECOVERY: 4,\n REST: 5,\n REPEAT: 6,\n MAIN: 8,\n} as const;\n\nexport const stepTypeKeySchema = z.enum([\n \"warmup\",\n \"cooldown\",\n \"interval\",\n \"recovery\",\n \"rest\",\n \"repeat\",\n \"main\",\n]);\n\nexport const garminStepTypeSchema = z.object({\n stepTypeId: z.number().int().positive(),\n stepTypeKey: stepTypeKeySchema,\n displayOrder: z.number().int().nonnegative(),\n});\n\nexport type GarminStepType = z.infer<typeof garminStepTypeSchema>;\n","import { z } from \"zod\";\n\nexport const TargetTypeId = {\n NO_TARGET: 1,\n POWER_ZONE: 2,\n CADENCE_ZONE: 3,\n HEART_RATE_ZONE: 4,\n SPEED_ZONE: 5,\n PACE_ZONE: 6,\n SWIM_CSS_OFFSET: 17,\n SWIM_INSTRUCTION: 18,\n} as const;\n\nexport const targetTypeKeySchema = z.enum([\n \"no.target\",\n \"power.zone\",\n \"cadence\",\n \"heart.rate.zone\",\n \"speed.zone\",\n \"pace.zone\",\n \"swim.css.offset\",\n \"swim.instruction\",\n]);\n\nexport const garminTargetTypeSchema = z.object({\n workoutTargetTypeId: z.number().int().positive(),\n workoutTargetTypeKey: targetTypeKeySchema,\n displayOrder: z.number().int().nonnegative(),\n});\n\nexport type GarminTargetType = z.infer<typeof garminTargetTypeSchema>;\n","import type { Duration, DurationType } from \"@kaiord/core\";\nimport type { GarminConditionType } from \"../schemas/common\";\nimport { ConditionTypeId } from \"../schemas/common\";\n\nexport const mapConditionToDuration = (\n conditionTypeKey: string,\n value: number\n): { durationType: DurationType; duration: Duration } => {\n switch (conditionTypeKey) {\n case \"time\":\n return {\n durationType: \"time\",\n duration: { type: \"time\", seconds: value },\n };\n case \"distance\":\n return {\n durationType: \"distance\",\n duration: { type: \"distance\", meters: value },\n };\n case \"calories\":\n return {\n durationType: \"calories\",\n duration: { type: \"calories\", calories: value },\n };\n case \"lap.button\":\n return {\n durationType: \"open\",\n duration: { type: \"open\" },\n };\n case \"reps\":\n return {\n durationType: \"open\",\n duration: { type: \"open\" },\n };\n default:\n return {\n durationType: \"open\",\n duration: { type: \"open\" },\n };\n }\n};\n\nimport type { z } from \"zod\";\nimport type { conditionTypeKeySchema } from \"../schemas/common\";\n\ntype ConditionTypeKey = z.infer<typeof conditionTypeKeySchema>;\n\nconst buildCondition = (\n id: number,\n key: ConditionTypeKey,\n order: number,\n displayable: boolean\n): GarminConditionType => ({\n conditionTypeId: id,\n conditionTypeKey: key,\n displayOrder: order,\n displayable,\n});\n\nexport const mapDurationToCondition = (\n durationType: string,\n duration: Duration\n): { endCondition: GarminConditionType; endConditionValue: number } => {\n switch (durationType) {\n case \"time\":\n return {\n endCondition: buildCondition(ConditionTypeId.TIME, \"time\", 2, true),\n endConditionValue: \"seconds\" in duration ? duration.seconds : 0,\n };\n case \"distance\":\n return {\n endCondition: buildCondition(\n ConditionTypeId.DISTANCE,\n \"distance\",\n 3,\n true\n ),\n endConditionValue: \"meters\" in duration ? duration.meters : 0,\n };\n case \"calories\":\n return {\n endCondition: buildCondition(\n ConditionTypeId.CALORIES,\n \"calories\",\n 4,\n true\n ),\n endConditionValue: \"calories\" in duration ? duration.calories : 0,\n };\n case \"open\":\n default:\n return {\n endCondition: buildCondition(\n ConditionTypeId.LAP_BUTTON,\n \"lap.button\",\n 1,\n true\n ),\n endConditionValue: 0,\n };\n }\n};\n","import type { Equipment } from \"@kaiord/core\";\nimport type { z } from \"zod\";\nimport type {\n equipmentTypeKeySchema,\n GarminEquipmentType,\n} from \"../schemas/common\";\n\ntype EquipmentTypeKey = NonNullable<z.infer<typeof equipmentTypeKeySchema>>;\n\nconst GARMIN_TO_KRD_EQUIPMENT: Record<string, Equipment> = {\n fins: \"swim_fins\",\n kickboard: \"swim_kickboard\",\n paddles: \"swim_paddles\",\n pull_buoy: \"swim_pull_buoy\",\n snorkel: \"swim_snorkel\",\n};\n\nconst KRD_TO_GARMIN_EQUIPMENT: Record<\n string,\n { id: number; key: EquipmentTypeKey; order: number }\n> = {\n swim_fins: { id: 1, key: \"fins\", order: 1 },\n swim_kickboard: { id: 2, key: \"kickboard\", order: 2 },\n swim_paddles: { id: 3, key: \"paddles\", order: 3 },\n swim_pull_buoy: { id: 4, key: \"pull_buoy\", order: 4 },\n swim_snorkel: { id: 5, key: \"snorkel\", order: 5 },\n};\n\nexport const mapGarminEquipmentToKrd = (\n equipmentTypeKey: string | null\n): Equipment | undefined => {\n if (!equipmentTypeKey) return undefined;\n return GARMIN_TO_KRD_EQUIPMENT[equipmentTypeKey];\n};\n\nexport const mapKrdEquipmentToGarmin = (\n equipment?: Equipment\n): GarminEquipmentType => {\n if (!equipment || equipment === \"none\") {\n return { equipmentTypeId: 0, equipmentTypeKey: null, displayOrder: 0 };\n }\n const mapped = KRD_TO_GARMIN_EQUIPMENT[equipment];\n if (!mapped) {\n return { equipmentTypeId: 0, equipmentTypeKey: null, displayOrder: 0 };\n }\n return {\n equipmentTypeId: mapped.id,\n equipmentTypeKey: mapped.key,\n displayOrder: mapped.order,\n };\n};\n","import type { Intensity } from \"@kaiord/core\";\n\nconst STEP_TYPE_TO_INTENSITY: Record<string, Intensity> = {\n warmup: \"warmup\",\n cooldown: \"cooldown\",\n interval: \"active\",\n recovery: \"recovery\",\n rest: \"rest\",\n main: \"active\",\n};\n\nconst INTENSITY_TO_STEP_TYPE: Record<string, string> = {\n warmup: \"warmup\",\n cooldown: \"cooldown\",\n active: \"interval\",\n recovery: \"recovery\",\n rest: \"rest\",\n interval: \"interval\",\n other: \"interval\",\n};\n\nexport const mapStepTypeToIntensity = (stepTypeKey: string): Intensity =>\n STEP_TYPE_TO_INTENSITY[stepTypeKey] ?? \"active\";\n\nexport const mapIntensityToStepType = (intensity: string): string =>\n INTENSITY_TO_STEP_TYPE[intensity] ?? \"interval\";\n","import type { Sport } from \"@kaiord/core\";\nimport type { GarminSportType } from \"../schemas/common\";\nimport { SportTypeId } from \"../schemas/common\";\n\nconst GARMIN_TO_KRD_SPORT: Record<string, Sport> = {\n running: \"running\",\n cycling: \"cycling\",\n swimming: \"swimming\",\n hiking: \"running\",\n strength_training: \"generic\",\n cardio_training: \"generic\",\n multi_sport: \"generic\",\n};\n\nconst KRD_TO_GARMIN_SPORT: Record<string, GarminSportType> = {\n running: {\n sportTypeId: SportTypeId.RUNNING,\n sportTypeKey: \"running\",\n displayOrder: 1,\n },\n cycling: {\n sportTypeId: SportTypeId.CYCLING,\n sportTypeKey: \"cycling\",\n displayOrder: 2,\n },\n swimming: {\n sportTypeId: SportTypeId.SWIMMING,\n sportTypeKey: \"swimming\",\n displayOrder: 3,\n },\n generic: {\n sportTypeId: SportTypeId.CARDIO_TRAINING,\n sportTypeKey: \"cardio_training\",\n displayOrder: 6,\n },\n};\n\nexport const mapGarminSportToKrd = (sportTypeKey: string): Sport =>\n GARMIN_TO_KRD_SPORT[sportTypeKey] ?? \"generic\";\n\nexport const mapKrdSportToGarmin = (sport: string): GarminSportType =>\n KRD_TO_GARMIN_SPORT[sport] ?? KRD_TO_GARMIN_SPORT[\"generic\"];\n","import type { SwimStroke } from \"@kaiord/core\";\nimport type { z } from \"zod\";\nimport type { GarminStrokeType, strokeTypeKeySchema } from \"../schemas/common\";\n\ntype StrokeTypeKey = NonNullable<z.infer<typeof strokeTypeKeySchema>>;\n\nconst GARMIN_TO_KRD_STROKE: Record<string, SwimStroke> = {\n free: \"freestyle\",\n backstroke: \"backstroke\",\n breaststroke: \"breaststroke\",\n fly: \"butterfly\",\n drill: \"drill\",\n mixed: \"mixed\",\n im: \"im\",\n};\n\nconst KRD_TO_GARMIN_STROKE: Record<\n string,\n { id: number; key: StrokeTypeKey; order: number }\n> = {\n freestyle: { id: 6, key: \"free\", order: 6 },\n backstroke: { id: 2, key: \"backstroke\", order: 2 },\n breaststroke: { id: 3, key: \"breaststroke\", order: 3 },\n butterfly: { id: 5, key: \"fly\", order: 5 },\n drill: { id: 4, key: \"drill\", order: 4 },\n mixed: { id: 7, key: \"mixed\", order: 7 },\n im: { id: 8, key: \"im\", order: 8 },\n};\n\nexport const mapGarminStrokeToKrd = (\n strokeTypeKey: string | null,\n strokeTypeId: number\n): SwimStroke | undefined => {\n if (!strokeTypeKey || strokeTypeId === 0) return undefined;\n if (strokeTypeKey === \"any_stroke\") return undefined;\n return GARMIN_TO_KRD_STROKE[strokeTypeKey];\n};\n\nexport const mapKrdStrokeToGarmin = (\n stroke?: SwimStroke | string\n): GarminStrokeType => {\n if (!stroke) {\n return { strokeTypeId: 0, strokeTypeKey: null, displayOrder: 0 };\n }\n const mapped = KRD_TO_GARMIN_STROKE[stroke];\n if (!mapped) {\n return { strokeTypeId: 0, strokeTypeKey: null, displayOrder: 0 };\n }\n return {\n strokeTypeId: mapped.id,\n strokeTypeKey: mapped.key,\n displayOrder: mapped.order,\n };\n};\n","import type { Target } from \"@kaiord/core\";\nimport type { GarminTargetType } from \"../schemas/common\";\nimport { TargetTypeId } from \"../schemas/common\";\n\ntype GarminTargetInfo = {\n targetType: GarminTargetType;\n targetValueOne: number | null;\n targetValueTwo: number | null;\n zoneNumber: number | null;\n};\n\nexport const mapGarminTargetToKrd = (\n targetTypeKey: string,\n valueOne: number | null,\n valueTwo: number | null,\n zoneNumber: number | null\n): { targetType: string; target: Target } => {\n switch (targetTypeKey) {\n case \"power.zone\":\n return mapPowerTarget(valueOne, valueTwo, zoneNumber);\n case \"heart.rate.zone\":\n return mapHeartRateTarget(valueOne, valueTwo, zoneNumber);\n case \"pace.zone\":\n return mapPaceTarget(valueOne, valueTwo, zoneNumber);\n case \"speed.zone\":\n return mapSpeedTarget(valueOne, valueTwo, zoneNumber);\n case \"cadence\":\n return mapCadenceTarget(valueOne, valueTwo);\n case \"no.target\":\n default:\n return { targetType: \"open\", target: { type: \"open\" } };\n }\n};\n\nconst mapPowerTarget = (\n v1: number | null,\n v2: number | null,\n zone: number | null\n): { targetType: string; target: Target } => {\n if (zone !== null) {\n return {\n targetType: \"power\",\n target: { type: \"power\", value: { unit: \"zone\", value: zone } },\n };\n }\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"power\",\n target: { type: \"power\", value: { unit: \"range\", min: v1, max: v2 } },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nconst mapHeartRateTarget = (\n v1: number | null,\n v2: number | null,\n zone: number | null\n): { targetType: string; target: Target } => {\n if (zone !== null) {\n return {\n targetType: \"heart_rate\",\n target: {\n type: \"heart_rate\",\n value: { unit: \"zone\", value: zone },\n },\n };\n }\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"heart_rate\",\n target: {\n type: \"heart_rate\",\n value: { unit: \"range\", min: v1, max: v2 },\n },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nconst mapPaceTarget = (\n v1: number | null,\n v2: number | null,\n zone: number | null\n): { targetType: string; target: Target } => {\n if (zone !== null) {\n return {\n targetType: \"pace\",\n target: { type: \"pace\", value: { unit: \"zone\", value: zone } },\n };\n }\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"pace\",\n target: { type: \"pace\", value: { unit: \"range\", min: v1, max: v2 } },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nconst mapSpeedTarget = (\n v1: number | null,\n v2: number | null,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _zone: number | null\n): { targetType: string; target: Target } => {\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"pace\",\n target: { type: \"pace\", value: { unit: \"range\", min: v1, max: v2 } },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nconst mapCadenceTarget = (\n v1: number | null,\n v2: number | null\n): { targetType: string; target: Target } => {\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"cadence\",\n target: {\n type: \"cadence\",\n value: { unit: \"range\", min: v1, max: v2 },\n },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nimport type { z } from \"zod\";\nimport type { targetTypeKeySchema } from \"../schemas/common\";\n\ntype TargetTypeKey = z.infer<typeof targetTypeKeySchema>;\n\nconst buildTargetType = (\n id: number,\n key: TargetTypeKey,\n order: number\n): GarminTargetType => ({\n workoutTargetTypeId: id,\n workoutTargetTypeKey: key,\n displayOrder: order,\n});\n\nexport const mapKrdTargetToGarmin = (target: Target): GarminTargetInfo => {\n switch (target.type) {\n case \"power\":\n return mapKrdPowerToGarmin(target.value);\n case \"heart_rate\":\n return mapKrdHeartRateToGarmin(target.value);\n case \"pace\":\n return mapKrdPaceToGarmin(target.value);\n case \"cadence\":\n return mapKrdCadenceToGarmin(target.value);\n case \"open\":\n default:\n return {\n targetType: buildTargetType(TargetTypeId.NO_TARGET, \"no.target\", 1),\n targetValueOne: null,\n targetValueTwo: null,\n zoneNumber: null,\n };\n }\n};\n\nconst mapKrdPowerToGarmin = (value: {\n unit: string;\n value?: number;\n min?: number;\n max?: number;\n}): GarminTargetInfo => {\n const tt = buildTargetType(TargetTypeId.POWER_ZONE, \"power.zone\", 2);\n if (value.unit === \"zone\") {\n return {\n targetType: tt,\n targetValueOne: null,\n targetValueTwo: null,\n zoneNumber: value.value ?? null,\n };\n }\n if (value.unit === \"range\") {\n return {\n targetType: tt,\n targetValueOne: value.min ?? null,\n targetValueTwo: value.max ?? null,\n zoneNumber: null,\n };\n }\n return {\n targetType: tt,\n targetValueOne: value.value ?? null,\n targetValueTwo: value.value ?? null,\n zoneNumber: null,\n };\n};\n\nconst mapKrdHeartRateToGarmin = (value: {\n unit: string;\n value?: number;\n min?: number;\n max?: number;\n}): GarminTargetInfo => {\n const tt = buildTargetType(\n TargetTypeId.HEART_RATE_ZONE,\n \"heart.rate.zone\",\n 4\n );\n if (value.unit === \"zone\") {\n return {\n targetType: tt,\n targetValueOne: null,\n targetValueTwo: null,\n zoneNumber: value.value ?? null,\n };\n }\n if (value.unit === \"range\") {\n return {\n targetType: tt,\n targetValueOne: value.min ?? null,\n targetValueTwo: value.max ?? null,\n zoneNumber: null,\n };\n }\n return {\n targetType: tt,\n targetValueOne: value.value ?? null,\n targetValueTwo: value.value ?? null,\n zoneNumber: null,\n };\n};\n\nconst mapKrdPaceToGarmin = (value: {\n unit: string;\n value?: number;\n min?: number;\n max?: number;\n}): GarminTargetInfo => {\n const tt = buildTargetType(TargetTypeId.PACE_ZONE, \"pace.zone\", 6);\n if (value.unit === \"zone\") {\n return {\n targetType: tt,\n targetValueOne: null,\n targetValueTwo: null,\n zoneNumber: value.value ?? null,\n };\n }\n if (value.unit === \"range\") {\n return {\n targetType: tt,\n targetValueOne: value.min ?? null,\n targetValueTwo: value.max ?? null,\n zoneNumber: null,\n };\n }\n return {\n targetType: tt,\n targetValueOne: value.value ?? null,\n targetValueTwo: value.value ?? null,\n zoneNumber: null,\n };\n};\n\nconst mapKrdCadenceToGarmin = (value: {\n unit: string;\n value?: number;\n min?: number;\n max?: number;\n}): GarminTargetInfo => {\n const tt = buildTargetType(TargetTypeId.CADENCE_ZONE, \"cadence\", 3);\n if (value.unit === \"range\") {\n return {\n targetType: tt,\n targetValueOne: value.min ?? null,\n targetValueTwo: value.max ?? null,\n zoneNumber: null,\n };\n }\n return {\n targetType: tt,\n targetValueOne: value.value ?? null,\n targetValueTwo: value.value ?? null,\n zoneNumber: null,\n };\n};\n","import type {\n KRD,\n Logger,\n RepetitionBlock,\n Target,\n TargetType,\n Workout,\n WorkoutStep,\n} from \"@kaiord/core\";\nimport { createGarminParsingError } from \"@kaiord/core\";\nimport type { ExecutableStepDTO } from \"../schemas/output\";\nimport type { GarminWorkoutStep } from \"../schemas/output/types\";\nimport { mapConditionToDuration } from \"../mappers/condition.mapper\";\nimport { mapGarminEquipmentToKrd } from \"../mappers/equipment.mapper\";\nimport { mapStepTypeToIntensity } from \"../mappers/intensity.mapper\";\nimport { mapGarminSportToKrd } from \"../mappers/sport.mapper\";\nimport { mapGarminStrokeToKrd } from \"../mappers/stroke.mapper\";\nimport { mapGarminTargetToKrd } from \"../mappers/target.mapper\";\n\nexport const convertGarminToKRD = (gcnString: string, logger: Logger): KRD => {\n logger.info(\"Parsing Garmin Connect JSON\");\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(gcnString);\n } catch (error) {\n throw createGarminParsingError(\"Invalid JSON in GCN file\", error);\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw createGarminParsingError(\"GCN data is not an object\");\n }\n const gcn = parsed as Record<string, unknown>;\n\n const sportType = gcn.sportType as {\n sportTypeKey: string;\n } | null;\n const sport = mapGarminSportToKrd(sportType?.sportTypeKey ?? \"\");\n const workoutName = (gcn.workoutName as string) ?? \"\";\n const segments =\n (gcn.workoutSegments as Array<Record<string, unknown>>) ?? [];\n\n const steps = flattenSegmentsToSteps(segments, logger);\n\n const workout: Workout = {\n name: workoutName.substring(0, 255),\n sport,\n steps,\n };\n\n addPoolLength(gcn, workout);\n\n const now = new Date().toISOString();\n\n return {\n version: \"1.0\",\n type: \"structured_workout\",\n metadata: {\n created: now,\n sport,\n manufacturer: \"garmin-connect\",\n },\n extensions: {\n structured_workout: workout,\n },\n };\n};\n\nconst flattenSegmentsToSteps = (\n segments: Array<Record<string, unknown>>,\n logger: Logger\n): Array<WorkoutStep | RepetitionBlock> => {\n const allSteps: Array<WorkoutStep | RepetitionBlock> = [];\n let stepIndex = 0;\n\n for (const segment of segments) {\n const workoutSteps = (segment.workoutSteps as GarminWorkoutStep[]) ?? [];\n\n for (const step of workoutSteps) {\n if (step.type === \"RepeatGroupDTO\") {\n const block = mapRepeatGroup(step, stepIndex, logger);\n stepIndex += block.steps.length;\n allSteps.push(block);\n } else {\n allSteps.push(mapExecutableStep(step, stepIndex));\n stepIndex++;\n }\n }\n }\n\n return allSteps;\n};\n\nconst mapExecutableStep = (\n step: ExecutableStepDTO,\n stepIndex: number\n): WorkoutStep => {\n const conditionKey = step.endCondition.conditionTypeKey;\n const { durationType, duration } = mapConditionToDuration(\n conditionKey,\n step.endConditionValue\n );\n\n const { targetType, target } = resolveTarget(step);\n const intensity = mapStepTypeToIntensity(step.stepType.stepTypeKey);\n const equipment = mapGarminEquipmentToKrd(\n step.equipmentType?.equipmentTypeKey\n );\n const stroke = mapGarminStrokeToKrd(\n step.strokeType?.strokeTypeKey,\n step.strokeType?.strokeTypeId\n );\n\n const result: WorkoutStep = {\n stepIndex,\n durationType,\n duration,\n targetType: targetType as TargetType,\n target,\n intensity,\n };\n\n if (equipment) result.equipment = equipment;\n\n if (stroke) {\n result.targetType = \"stroke_type\";\n result.target = {\n type: \"stroke_type\",\n value: { unit: \"swim_stroke\", value: strokeToFitValue(stroke) },\n };\n }\n\n return result;\n};\n\nconst resolveTarget = (\n step: ExecutableStepDTO\n): { targetType: string; target: Target } => {\n const primary = mapGarminTargetToKrd(\n step.targetType.workoutTargetTypeKey,\n step.targetValueOne,\n step.targetValueTwo,\n step.zoneNumber\n );\n\n if (step.secondaryTargetType && primary.targetType === \"open\") {\n return mapGarminTargetToKrd(\n step.secondaryTargetType.workoutTargetTypeKey,\n step.secondaryTargetValueOne,\n step.secondaryTargetValueTwo,\n step.secondaryZoneNumber\n );\n }\n\n return primary;\n};\n\ntype RepeatGroupLike = {\n numberOfIterations: number;\n workoutSteps: GarminWorkoutStep[];\n};\n\nconst mapRepeatGroup = (\n group: RepeatGroupLike,\n startIndex: number,\n logger: Logger\n): RepetitionBlock => {\n const steps: WorkoutStep[] = [];\n let idx = startIndex;\n\n for (const step of group.workoutSteps) {\n if (step.type === \"ExecutableStepDTO\") {\n steps.push(mapExecutableStep(step, idx));\n idx++;\n } else {\n logger.warn(\"Nested repeat groups are flattened\", {\n iterations: step.numberOfIterations,\n });\n const nested = mapRepeatGroup(step, idx, logger);\n for (const s of nested.steps) {\n steps.push({ ...s, stepIndex: idx });\n idx++;\n }\n }\n }\n\n return {\n repeatCount: group.numberOfIterations,\n steps,\n };\n};\n\nconst addPoolLength = (\n gcn: Record<string, unknown>,\n workout: Workout\n): void => {\n const poolLength = gcn.poolLength as number | null;\n if (poolLength && poolLength > 0) {\n workout.poolLength = poolLength;\n workout.poolLengthUnit = \"meters\";\n }\n};\n\nconst STROKE_TO_FIT: Record<string, number> = {\n freestyle: 0,\n backstroke: 1,\n breaststroke: 2,\n butterfly: 3,\n drill: 4,\n mixed: 5,\n im: 5,\n};\n\nconst strokeToFitValue = (stroke: string): number => STROKE_TO_FIT[stroke] ?? 0;\n","import type { Logger, TextReader } from \"@kaiord/core\";\nimport { convertGarminToKRD } from \"./converters/garmin-to-krd.converter\";\n\nexport const createGarminReader =\n (logger: Logger): TextReader =>\n async (gcnString: string) =>\n convertGarminToKRD(gcnString, logger);\n","import type {\n KRD,\n Logger,\n RepetitionBlock,\n Workout,\n WorkoutStep,\n} from \"@kaiord/core\";\nimport { createGarminParsingError } from \"@kaiord/core\";\nimport { ConditionTypeId, StepTypeId } from \"../schemas/common\";\nimport type { GarminWorkoutStepInput } from \"../schemas/input/types\";\nimport { mapDurationToCondition } from \"../mappers/condition.mapper\";\nimport { mapKrdEquipmentToGarmin } from \"../mappers/equipment.mapper\";\nimport { mapIntensityToStepType } from \"../mappers/intensity.mapper\";\nimport { mapKrdSportToGarmin } from \"../mappers/sport.mapper\";\nimport { mapKrdStrokeToGarmin } from \"../mappers/stroke.mapper\";\nimport { mapKrdTargetToGarmin } from \"../mappers/target.mapper\";\n\nexport const convertKRDToGarmin = (krd: KRD, logger: Logger): string => {\n logger.info(\"Converting KRD to Garmin Connect JSON\");\n\n const workout = extractWorkout(krd);\n if (!workout) {\n throw createGarminParsingError(\"KRD does not contain a structured workout\");\n }\n\n const sportType = mapKrdSportToGarmin(workout.sport);\n const counter = { value: 1 };\n\n const workoutSteps: GarminWorkoutStepInput[] = workout.steps.map((step) =>\n isRepetitionBlock(step)\n ? mapRepetitionBlock(step, counter)\n : mapWorkoutStep(step, counter)\n );\n\n const input = {\n sportType,\n workoutName: (workout.name ?? \"Kaiord Workout\").substring(0, 255),\n workoutSegments: [\n {\n segmentOrder: 1,\n sportType,\n workoutSteps,\n },\n ],\n poolLength: undefined as number | undefined,\n poolLengthUnit: undefined as\n | { unitId: number; unitKey: string; factor: number }\n | undefined,\n };\n\n addPoolInfo(workout, input);\n\n logger.info(\"KRD to Garmin GCN conversion complete\");\n return JSON.stringify(input, null, 2);\n};\n\nconst extractWorkout = (krd: KRD): Workout | undefined => {\n const ext = krd.extensions?.structured_workout;\n if (!ext || typeof ext !== \"object\") return undefined;\n return ext as Workout;\n};\n\nconst isRepetitionBlock = (\n step: WorkoutStep | RepetitionBlock\n): step is RepetitionBlock => \"repeatCount\" in step;\n\nconst STEP_TYPE_IDS: Record<string, number> = {\n warmup: StepTypeId.WARMUP,\n cooldown: StepTypeId.COOLDOWN,\n interval: StepTypeId.INTERVAL,\n recovery: StepTypeId.RECOVERY,\n rest: StepTypeId.REST,\n};\n\nconst STEP_TYPE_ORDER: Record<string, number> = {\n warmup: 1,\n cooldown: 2,\n interval: 3,\n recovery: 4,\n rest: 5,\n};\n\nconst getStepTypeInfo = (intensity: string) => {\n const key = mapIntensityToStepType(intensity);\n return {\n stepTypeId: STEP_TYPE_IDS[key] ?? StepTypeId.INTERVAL,\n stepTypeKey: key as\n | \"warmup\"\n | \"cooldown\"\n | \"interval\"\n | \"recovery\"\n | \"rest\",\n displayOrder: STEP_TYPE_ORDER[key] ?? 3,\n };\n};\n\nconst mapWorkoutStep = (\n step: WorkoutStep,\n counter: { value: number }\n): GarminWorkoutStepInput => {\n const stepOrder = counter.value++;\n const stepType = getStepTypeInfo(step.intensity ?? \"active\");\n const { endCondition, endConditionValue } = mapDurationToCondition(\n step.durationType,\n step.duration\n );\n const { targetType, targetValueOne, targetValueTwo, zoneNumber } =\n mapKrdTargetToGarmin(step.target);\n\n const strokeType =\n step.target.type === \"stroke_type\"\n ? mapKrdStrokeToGarmin(fitValueToStroke(extractStrokeValue(step.target)))\n : mapKrdStrokeToGarmin(undefined);\n\n const equipmentType = mapKrdEquipmentToGarmin(step.equipment);\n\n return {\n type: \"ExecutableStepDTO\",\n stepOrder,\n stepType,\n endCondition,\n endConditionValue,\n targetType,\n targetValueOne,\n targetValueTwo,\n zoneNumber,\n secondaryTargetType: null,\n secondaryTargetValueOne: null,\n secondaryTargetValueTwo: null,\n secondaryZoneNumber: null,\n strokeType,\n equipmentType,\n };\n};\n\nconst mapRepetitionBlock = (\n block: RepetitionBlock,\n counter: { value: number }\n): GarminWorkoutStepInput => {\n const stepOrder = counter.value++;\n const innerSteps: GarminWorkoutStepInput[] = block.steps.map((step) =>\n mapWorkoutStep(step, counter)\n );\n\n return {\n type: \"RepeatGroupDTO\",\n stepOrder,\n stepType: {\n stepTypeId: StepTypeId.REPEAT,\n stepTypeKey: \"repeat\",\n displayOrder: 6,\n },\n numberOfIterations: block.repeatCount,\n endCondition: {\n conditionTypeId: ConditionTypeId.ITERATIONS,\n conditionTypeKey: \"iterations\",\n displayOrder: 7,\n displayable: false,\n },\n endConditionValue: block.repeatCount,\n workoutSteps: innerSteps,\n };\n};\n\ntype PoolInput = {\n poolLength?: number;\n poolLengthUnit?: { unitId: number; unitKey: string; factor: number };\n};\n\nconst addPoolInfo = (workout: Workout, input: PoolInput): void => {\n if (workout.poolLength && workout.poolLength > 0) {\n input.poolLength = workout.poolLength;\n input.poolLengthUnit = {\n unitId: 1,\n unitKey: \"meter\",\n factor: 100,\n };\n }\n};\n\nconst FIT_TO_STROKE: Record<number, string> = {\n 0: \"freestyle\",\n 1: \"backstroke\",\n 2: \"breaststroke\",\n 3: \"butterfly\",\n 4: \"drill\",\n 5: \"mixed\",\n};\n\nconst extractStrokeValue = (target: { value?: { value: number } }): number => {\n return target.value?.value ?? 0;\n};\n\nconst fitValueToStroke = (value: number): string | undefined =>\n FIT_TO_STROKE[value];\n","import type { Logger, TextWriter } from \"@kaiord/core\";\nimport { convertKRDToGarmin } from \"./converters/krd-to-garmin.converter\";\n\nexport const createGarminWriter =\n (logger: Logger): TextWriter =>\n async (krd) =>\n convertKRDToGarmin(krd, logger);\n","import type { Logger } from \"@kaiord/core\";\nimport { createConsoleLogger, createWorkoutKRD, toText } from \"@kaiord/core\";\nimport { createGarminWriter } from \"./garmin-writer\";\n\n/**\n * Creates a function that converts a Workout directly to Garmin Connect JSON.\n *\n * Composition facade: wraps application-layer orchestration (toText) with\n * the garmin writer. This is a convenience for consumers who don't need\n * the intermediate KRD step.\n *\n * Input is validated against workoutSchema.\n * Throws KrdValidationError if the workout structure is invalid.\n *\n * @param logger - Optional logger (defaults to console logger)\n * @returns Function that converts unknown workout data to Garmin JSON string\n */\nexport const createWorkoutToGarmin =\n (logger?: Logger) =>\n async (workout: unknown): Promise<string> => {\n const log = logger ?? createConsoleLogger();\n const krd = createWorkoutKRD(workout);\n return toText(krd, createGarminWriter(log), log);\n };\n\n/**\n * Converts a Workout directly to Garmin Connect JSON format.\n * Pre-built instance using the default console logger.\n */\nexport const workoutToGarmin = createWorkoutToGarmin();\n","/**\n * @kaiord/garmin - Garmin Connect API (GCN) format adapter for Kaiord\n */\n\nimport type { Logger, TextReader, TextWriter } from \"@kaiord/core\";\nimport { createConsoleLogger } from \"@kaiord/core\";\nimport { createGarminReader as createGarminReaderImpl } from \"./adapters/garmin-reader\";\nimport { createGarminWriter as createGarminWriterImpl } from \"./adapters/garmin-writer\";\n\nexport const createGarminReader = (logger?: Logger): TextReader =>\n createGarminReaderImpl(logger || createConsoleLogger());\n\nexport const createGarminWriter = (logger?: Logger): TextWriter =>\n createGarminWriterImpl(logger || createConsoleLogger());\n\nexport const garminReader: TextReader = createGarminReader();\nexport const garminWriter: TextWriter = createGarminWriter();\n\nexport {\n createWorkoutToGarmin,\n workoutToGarmin,\n} from \"./adapters/workout-to-garmin\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/schemas/common/condition-type.schema.ts","../src/adapters/schemas/common/sport-type.schema.ts","../src/adapters/schemas/common/step-type.schema.ts","../src/adapters/schemas/common/target-type.schema.ts","../src/adapters/mappers/condition.mapper.ts","../src/adapters/mappers/equipment.mapper.ts","../src/adapters/mappers/intensity.mapper.ts","../src/adapters/mappers/sport.mapper.ts","../src/adapters/mappers/stroke.mapper.ts","../src/adapters/mappers/target.mapper.ts","../src/adapters/converters/garmin-to-krd.converter.ts","../src/adapters/garmin-reader.ts","../src/adapters/converters/krd-to-garmin.converter.ts","../src/adapters/garmin-writer.ts","../src/adapters/workout-to-garmin.ts","../src/index.ts"],"names":["z","createGarminParsingError","createGarminReader","createConsoleLogger","createGarminWriter"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nexport const ConditionTypeId = {\n LAP_BUTTON: 1,\n TIME: 2,\n DISTANCE: 3,\n CALORIES: 4,\n HEART_RATE: 5,\n POWER: 6,\n ITERATIONS: 7,\n FIXED_REST: 8,\n REPS: 10,\n} as const;\n\nexport const conditionTypeKeySchema = z.enum([\n \"lap.button\",\n \"time\",\n \"distance\",\n \"calories\",\n \"heart.rate\",\n \"power\",\n \"iterations\",\n \"fixed.rest\",\n \"reps\",\n]);\n\nexport const garminConditionTypeSchema = z.object({\n conditionTypeId: z.number().int().positive(),\n conditionTypeKey: conditionTypeKeySchema,\n displayOrder: z.number().int().nonnegative(),\n displayable: z.boolean(),\n});\n\nexport type GarminConditionType = z.infer<typeof garminConditionTypeSchema>;\n","import { z } from \"zod\";\n\nexport const SportTypeId = {\n RUNNING: 1,\n CYCLING: 2,\n HIKING: 3,\n SWIMMING: 4,\n STRENGTH_TRAINING: 5,\n CARDIO_TRAINING: 6,\n MULTI_SPORT: 10,\n} as const;\n\nexport const sportTypeKeySchema = z.enum([\n \"running\",\n \"cycling\",\n \"hiking\",\n \"swimming\",\n \"strength_training\",\n \"cardio_training\",\n \"multi_sport\",\n]);\n\nexport const garminSportTypeSchema = z.object({\n sportTypeId: z.number().int().positive(),\n sportTypeKey: sportTypeKeySchema,\n displayOrder: z.number().int().nonnegative().optional(),\n});\n\nexport type GarminSportType = z.infer<typeof garminSportTypeSchema>;\n","import { z } from \"zod\";\n\nexport const StepTypeId = {\n WARMUP: 1,\n COOLDOWN: 2,\n INTERVAL: 3,\n RECOVERY: 4,\n REST: 5,\n REPEAT: 6,\n MAIN: 8,\n} as const;\n\nexport const stepTypeKeySchema = z.enum([\n \"warmup\",\n \"cooldown\",\n \"interval\",\n \"recovery\",\n \"rest\",\n \"repeat\",\n \"main\",\n]);\n\nexport const garminStepTypeSchema = z.object({\n stepTypeId: z.number().int().positive(),\n stepTypeKey: stepTypeKeySchema,\n displayOrder: z.number().int().nonnegative(),\n});\n\nexport type GarminStepType = z.infer<typeof garminStepTypeSchema>;\n","import { z } from \"zod\";\n\nexport const TargetTypeId = {\n NO_TARGET: 1,\n POWER_ZONE: 2,\n CADENCE_ZONE: 3,\n HEART_RATE_ZONE: 4,\n SPEED_ZONE: 5,\n PACE_ZONE: 6,\n SWIM_CSS_OFFSET: 17,\n SWIM_INSTRUCTION: 18,\n} as const;\n\nexport const targetTypeKeySchema = z.enum([\n \"no.target\",\n \"power.zone\",\n \"cadence\",\n \"heart.rate.zone\",\n \"speed.zone\",\n \"pace.zone\",\n \"swim.css.offset\",\n \"swim.instruction\",\n]);\n\nexport const garminTargetTypeSchema = z.object({\n workoutTargetTypeId: z.number().int().positive(),\n workoutTargetTypeKey: targetTypeKeySchema,\n displayOrder: z.number().int().nonnegative(),\n});\n\nexport type GarminTargetType = z.infer<typeof garminTargetTypeSchema>;\n","import type { Duration, DurationType } from \"@kaiord/core\";\nimport type { GarminConditionType } from \"../schemas/common\";\nimport { ConditionTypeId } from \"../schemas/common\";\n\nexport const mapConditionToDuration = (\n conditionTypeKey: string,\n value: number\n): { durationType: DurationType; duration: Duration } => {\n switch (conditionTypeKey) {\n case \"time\":\n return {\n durationType: \"time\",\n duration: { type: \"time\", seconds: value },\n };\n case \"distance\":\n return {\n durationType: \"distance\",\n duration: { type: \"distance\", meters: value },\n };\n case \"calories\":\n return {\n durationType: \"calories\",\n duration: { type: \"calories\", calories: value },\n };\n case \"lap.button\":\n return {\n durationType: \"open\",\n duration: { type: \"open\" },\n };\n case \"reps\":\n return {\n durationType: \"open\",\n duration: { type: \"open\" },\n };\n default:\n return {\n durationType: \"open\",\n duration: { type: \"open\" },\n };\n }\n};\n\nimport type { z } from \"zod\";\nimport type { conditionTypeKeySchema } from \"../schemas/common\";\n\ntype ConditionTypeKey = z.infer<typeof conditionTypeKeySchema>;\n\nconst buildCondition = (\n id: number,\n key: ConditionTypeKey,\n order: number,\n displayable: boolean\n): GarminConditionType => ({\n conditionTypeId: id,\n conditionTypeKey: key,\n displayOrder: order,\n displayable,\n});\n\nexport const mapDurationToCondition = (\n durationType: string,\n duration: Duration\n): { endCondition: GarminConditionType; endConditionValue: number } => {\n switch (durationType) {\n case \"time\":\n return {\n endCondition: buildCondition(ConditionTypeId.TIME, \"time\", 2, true),\n endConditionValue: \"seconds\" in duration ? duration.seconds : 0,\n };\n case \"distance\":\n return {\n endCondition: buildCondition(\n ConditionTypeId.DISTANCE,\n \"distance\",\n 3,\n true\n ),\n endConditionValue: \"meters\" in duration ? duration.meters : 0,\n };\n case \"calories\":\n return {\n endCondition: buildCondition(\n ConditionTypeId.CALORIES,\n \"calories\",\n 4,\n true\n ),\n endConditionValue: \"calories\" in duration ? duration.calories : 0,\n };\n case \"open\":\n default:\n return {\n endCondition: buildCondition(\n ConditionTypeId.LAP_BUTTON,\n \"lap.button\",\n 1,\n true\n ),\n endConditionValue: 0,\n };\n }\n};\n","import type { Equipment } from \"@kaiord/core\";\nimport type { z } from \"zod\";\nimport type {\n equipmentTypeKeySchema,\n GarminEquipmentType,\n} from \"../schemas/common\";\n\ntype EquipmentTypeKey = NonNullable<z.infer<typeof equipmentTypeKeySchema>>;\n\nconst GARMIN_TO_KRD_EQUIPMENT: Record<string, Equipment> = {\n fins: \"swim_fins\",\n kickboard: \"swim_kickboard\",\n paddles: \"swim_paddles\",\n pull_buoy: \"swim_pull_buoy\",\n snorkel: \"swim_snorkel\",\n};\n\nconst KRD_TO_GARMIN_EQUIPMENT: Record<\n string,\n { id: number; key: EquipmentTypeKey; order: number }\n> = {\n swim_fins: { id: 1, key: \"fins\", order: 1 },\n swim_kickboard: { id: 2, key: \"kickboard\", order: 2 },\n swim_paddles: { id: 3, key: \"paddles\", order: 3 },\n swim_pull_buoy: { id: 4, key: \"pull_buoy\", order: 4 },\n swim_snorkel: { id: 5, key: \"snorkel\", order: 5 },\n};\n\nexport const mapGarminEquipmentToKrd = (\n equipmentTypeKey: string | null\n): Equipment | undefined => {\n if (!equipmentTypeKey) return undefined;\n return GARMIN_TO_KRD_EQUIPMENT[equipmentTypeKey];\n};\n\nexport const mapKrdEquipmentToGarmin = (\n equipment?: Equipment\n): GarminEquipmentType => {\n if (!equipment || equipment === \"none\") {\n return { equipmentTypeId: 0, equipmentTypeKey: null, displayOrder: 0 };\n }\n const mapped = KRD_TO_GARMIN_EQUIPMENT[equipment];\n if (!mapped) {\n return { equipmentTypeId: 0, equipmentTypeKey: null, displayOrder: 0 };\n }\n return {\n equipmentTypeId: mapped.id,\n equipmentTypeKey: mapped.key,\n displayOrder: mapped.order,\n };\n};\n","import type { Intensity } from \"@kaiord/core\";\n\nconst STEP_TYPE_TO_INTENSITY: Record<string, Intensity> = {\n warmup: \"warmup\",\n cooldown: \"cooldown\",\n interval: \"active\",\n recovery: \"recovery\",\n rest: \"rest\",\n main: \"active\",\n};\n\nexport type StepTypeKey =\n | \"warmup\"\n | \"cooldown\"\n | \"interval\"\n | \"recovery\"\n | \"rest\";\n\nconst INTENSITY_TO_STEP_TYPE: Record<string, StepTypeKey> = {\n warmup: \"warmup\",\n cooldown: \"cooldown\",\n active: \"interval\",\n recovery: \"recovery\",\n rest: \"rest\",\n interval: \"interval\",\n other: \"interval\",\n};\n\nexport const mapStepTypeToIntensity = (stepTypeKey: string): Intensity =>\n STEP_TYPE_TO_INTENSITY[stepTypeKey] ?? \"active\";\n\nexport const mapIntensityToStepType = (intensity: string): StepTypeKey =>\n INTENSITY_TO_STEP_TYPE[intensity] ?? \"interval\";\n","import type { Sport } from \"@kaiord/core\";\nimport type { GarminSportType } from \"../schemas/common\";\nimport { SportTypeId } from \"../schemas/common\";\n\nconst GARMIN_TO_KRD_SPORT: Record<string, Sport> = {\n running: \"running\",\n cycling: \"cycling\",\n swimming: \"swimming\",\n hiking: \"running\",\n strength_training: \"generic\",\n cardio_training: \"generic\",\n multi_sport: \"generic\",\n};\n\nconst KRD_TO_GARMIN_SPORT: Record<string, GarminSportType> = {\n running: {\n sportTypeId: SportTypeId.RUNNING,\n sportTypeKey: \"running\",\n displayOrder: 1,\n },\n cycling: {\n sportTypeId: SportTypeId.CYCLING,\n sportTypeKey: \"cycling\",\n displayOrder: 2,\n },\n swimming: {\n sportTypeId: SportTypeId.SWIMMING,\n sportTypeKey: \"swimming\",\n displayOrder: 3,\n },\n generic: {\n sportTypeId: SportTypeId.CARDIO_TRAINING,\n sportTypeKey: \"cardio_training\",\n displayOrder: 6,\n },\n};\n\nexport const mapGarminSportToKrd = (sportTypeKey: string): Sport =>\n GARMIN_TO_KRD_SPORT[sportTypeKey] ?? \"generic\";\n\nexport const mapKrdSportToGarmin = (sport: string): GarminSportType =>\n KRD_TO_GARMIN_SPORT[sport] ?? KRD_TO_GARMIN_SPORT[\"generic\"];\n","import type { SwimStroke } from \"@kaiord/core\";\nimport type { z } from \"zod\";\nimport type { GarminStrokeType, strokeTypeKeySchema } from \"../schemas/common\";\n\ntype StrokeTypeKey = NonNullable<z.infer<typeof strokeTypeKeySchema>>;\n\nconst GARMIN_TO_KRD_STROKE: Record<string, SwimStroke> = {\n free: \"freestyle\",\n backstroke: \"backstroke\",\n breaststroke: \"breaststroke\",\n fly: \"butterfly\",\n drill: \"drill\",\n mixed: \"mixed\",\n im: \"im\",\n};\n\nconst KRD_TO_GARMIN_STROKE: Record<\n string,\n { id: number; key: StrokeTypeKey; order: number }\n> = {\n freestyle: { id: 6, key: \"free\", order: 6 },\n backstroke: { id: 2, key: \"backstroke\", order: 2 },\n breaststroke: { id: 3, key: \"breaststroke\", order: 3 },\n butterfly: { id: 5, key: \"fly\", order: 5 },\n drill: { id: 4, key: \"drill\", order: 4 },\n mixed: { id: 7, key: \"mixed\", order: 7 },\n im: { id: 8, key: \"im\", order: 8 },\n};\n\nexport const mapGarminStrokeToKrd = (\n strokeTypeKey: string | null,\n strokeTypeId: number\n): SwimStroke | undefined => {\n if (!strokeTypeKey || strokeTypeId === 0) return undefined;\n if (strokeTypeKey === \"any_stroke\") return undefined;\n return GARMIN_TO_KRD_STROKE[strokeTypeKey];\n};\n\nexport const mapKrdStrokeToGarmin = (\n stroke?: SwimStroke | string\n): GarminStrokeType => {\n if (!stroke) {\n return { strokeTypeId: 0, strokeTypeKey: null, displayOrder: 0 };\n }\n const mapped = KRD_TO_GARMIN_STROKE[stroke];\n if (!mapped) {\n return { strokeTypeId: 0, strokeTypeKey: null, displayOrder: 0 };\n }\n return {\n strokeTypeId: mapped.id,\n strokeTypeKey: mapped.key,\n displayOrder: mapped.order,\n };\n};\n","import type { Target, TargetType } from \"@kaiord/core\";\nimport type { GarminTargetType } from \"../schemas/common\";\nimport { TargetTypeId } from \"../schemas/common\";\n\ntype GarminTargetInfo = {\n targetType: GarminTargetType;\n targetValueOne: number | null;\n targetValueTwo: number | null;\n zoneNumber: number | null;\n};\n\nexport const mapGarminTargetToKrd = (\n targetTypeKey: string,\n valueOne: number | null,\n valueTwo: number | null,\n zoneNumber: number | null\n): { targetType: TargetType; target: Target } => {\n switch (targetTypeKey) {\n case \"power.zone\":\n return mapPowerTarget(valueOne, valueTwo, zoneNumber);\n case \"heart.rate.zone\":\n return mapHeartRateTarget(valueOne, valueTwo, zoneNumber);\n case \"pace.zone\":\n return mapPaceTarget(valueOne, valueTwo, zoneNumber);\n case \"speed.zone\":\n return mapSpeedTarget(valueOne, valueTwo, zoneNumber);\n case \"cadence\":\n return mapCadenceTarget(valueOne, valueTwo);\n case \"no.target\":\n default:\n return { targetType: \"open\", target: { type: \"open\" } };\n }\n};\n\nconst mapPowerTarget = (\n v1: number | null,\n v2: number | null,\n zone: number | null\n): { targetType: TargetType; target: Target } => {\n if (zone !== null) {\n return {\n targetType: \"power\",\n target: { type: \"power\", value: { unit: \"zone\", value: zone } },\n };\n }\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"power\",\n target: { type: \"power\", value: { unit: \"range\", min: v1, max: v2 } },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nconst mapHeartRateTarget = (\n v1: number | null,\n v2: number | null,\n zone: number | null\n): { targetType: TargetType; target: Target } => {\n if (zone !== null) {\n return {\n targetType: \"heart_rate\",\n target: {\n type: \"heart_rate\",\n value: { unit: \"zone\", value: zone },\n },\n };\n }\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"heart_rate\",\n target: {\n type: \"heart_rate\",\n value: { unit: \"range\", min: v1, max: v2 },\n },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nconst mapPaceTarget = (\n v1: number | null,\n v2: number | null,\n zone: number | null\n): { targetType: TargetType; target: Target } => {\n if (zone !== null) {\n return {\n targetType: \"pace\",\n target: { type: \"pace\", value: { unit: \"zone\", value: zone } },\n };\n }\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"pace\",\n target: { type: \"pace\", value: { unit: \"range\", min: v1, max: v2 } },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nconst mapSpeedTarget = (\n v1: number | null,\n v2: number | null,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _zone: number | null\n): { targetType: TargetType; target: Target } => {\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"pace\",\n target: { type: \"pace\", value: { unit: \"range\", min: v1, max: v2 } },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nconst mapCadenceTarget = (\n v1: number | null,\n v2: number | null\n): { targetType: TargetType; target: Target } => {\n if (v1 !== null && v2 !== null) {\n return {\n targetType: \"cadence\",\n target: {\n type: \"cadence\",\n value: { unit: \"range\", min: v1, max: v2 },\n },\n };\n }\n return { targetType: \"open\", target: { type: \"open\" } };\n};\n\nimport type { z } from \"zod\";\nimport type { targetTypeKeySchema } from \"../schemas/common\";\n\ntype TargetTypeKey = z.infer<typeof targetTypeKeySchema>;\n\nconst buildTargetType = (\n id: number,\n key: TargetTypeKey,\n order: number\n): GarminTargetType => ({\n workoutTargetTypeId: id,\n workoutTargetTypeKey: key,\n displayOrder: order,\n});\n\nexport const mapKrdTargetToGarmin = (target: Target): GarminTargetInfo => {\n switch (target.type) {\n case \"power\":\n return mapKrdPowerToGarmin(target.value);\n case \"heart_rate\":\n return mapKrdHeartRateToGarmin(target.value);\n case \"pace\":\n return mapKrdPaceToGarmin(target.value);\n case \"cadence\":\n return mapKrdCadenceToGarmin(target.value);\n case \"open\":\n default:\n return {\n targetType: buildTargetType(TargetTypeId.NO_TARGET, \"no.target\", 1),\n targetValueOne: null,\n targetValueTwo: null,\n zoneNumber: null,\n };\n }\n};\n\nconst mapKrdPowerToGarmin = (value: {\n unit: string;\n value?: number;\n min?: number;\n max?: number;\n}): GarminTargetInfo => {\n const tt = buildTargetType(TargetTypeId.POWER_ZONE, \"power.zone\", 2);\n if (value.unit === \"zone\") {\n return {\n targetType: tt,\n targetValueOne: null,\n targetValueTwo: null,\n zoneNumber: value.value ?? null,\n };\n }\n if (value.unit === \"range\") {\n return {\n targetType: tt,\n targetValueOne: value.min ?? null,\n targetValueTwo: value.max ?? null,\n zoneNumber: null,\n };\n }\n return {\n targetType: tt,\n targetValueOne: value.value ?? null,\n targetValueTwo: value.value ?? null,\n zoneNumber: null,\n };\n};\n\nconst mapKrdHeartRateToGarmin = (value: {\n unit: string;\n value?: number;\n min?: number;\n max?: number;\n}): GarminTargetInfo => {\n const tt = buildTargetType(\n TargetTypeId.HEART_RATE_ZONE,\n \"heart.rate.zone\",\n 4\n );\n if (value.unit === \"zone\") {\n return {\n targetType: tt,\n targetValueOne: null,\n targetValueTwo: null,\n zoneNumber: value.value ?? null,\n };\n }\n if (value.unit === \"range\") {\n return {\n targetType: tt,\n targetValueOne: value.min ?? null,\n targetValueTwo: value.max ?? null,\n zoneNumber: null,\n };\n }\n return {\n targetType: tt,\n targetValueOne: value.value ?? null,\n targetValueTwo: value.value ?? null,\n zoneNumber: null,\n };\n};\n\nconst mapKrdPaceToGarmin = (value: {\n unit: string;\n value?: number;\n min?: number;\n max?: number;\n}): GarminTargetInfo => {\n const tt = buildTargetType(TargetTypeId.PACE_ZONE, \"pace.zone\", 6);\n if (value.unit === \"zone\") {\n return {\n targetType: tt,\n targetValueOne: null,\n targetValueTwo: null,\n zoneNumber: value.value ?? null,\n };\n }\n if (value.unit === \"range\") {\n return {\n targetType: tt,\n targetValueOne: value.min ?? null,\n targetValueTwo: value.max ?? null,\n zoneNumber: null,\n };\n }\n return {\n targetType: tt,\n targetValueOne: value.value ?? null,\n targetValueTwo: value.value ?? null,\n zoneNumber: null,\n };\n};\n\nconst mapKrdCadenceToGarmin = (value: {\n unit: string;\n value?: number;\n min?: number;\n max?: number;\n}): GarminTargetInfo => {\n const tt = buildTargetType(TargetTypeId.CADENCE_ZONE, \"cadence\", 3);\n if (value.unit === \"range\") {\n return {\n targetType: tt,\n targetValueOne: value.min ?? null,\n targetValueTwo: value.max ?? null,\n zoneNumber: null,\n };\n }\n return {\n targetType: tt,\n targetValueOne: value.value ?? null,\n targetValueTwo: value.value ?? null,\n zoneNumber: null,\n };\n};\n","import { z } from \"zod\";\nimport type {\n KRD,\n Logger,\n RepetitionBlock,\n Target,\n TargetType,\n Workout,\n WorkoutStep,\n} from \"@kaiord/core\";\nimport { createGarminParsingError } from \"@kaiord/core\";\nimport { mapConditionToDuration } from \"../mappers/condition.mapper\";\nimport { mapGarminEquipmentToKrd } from \"../mappers/equipment.mapper\";\nimport { mapStepTypeToIntensity } from \"../mappers/intensity.mapper\";\nimport { mapGarminSportToKrd } from \"../mappers/sport.mapper\";\nimport { mapGarminStrokeToKrd } from \"../mappers/stroke.mapper\";\nimport { mapGarminTargetToKrd } from \"../mappers/target.mapper\";\n\nconst executableStepParseSchema = z\n .object({\n type: z.literal(\"ExecutableStepDTO\"),\n stepType: z.object({ stepTypeKey: z.string() }).passthrough(),\n endCondition: z.object({ conditionTypeKey: z.string() }).passthrough(),\n endConditionValue: z.number(),\n targetType: z.object({ workoutTargetTypeKey: z.string() }).passthrough(),\n targetValueOne: z.number().nullable().optional(),\n targetValueTwo: z.number().nullable().optional(),\n zoneNumber: z.number().nullable().optional(),\n secondaryTargetType: z\n .object({ workoutTargetTypeKey: z.string() })\n .passthrough()\n .nullable()\n .optional(),\n secondaryTargetValueOne: z.number().nullable().optional(),\n secondaryTargetValueTwo: z.number().nullable().optional(),\n secondaryZoneNumber: z.number().nullable().optional(),\n strokeType: z\n .object({\n strokeTypeKey: z.string().nullable().optional(),\n strokeTypeId: z.number().nullable().optional(),\n })\n .passthrough()\n .nullable()\n .optional(),\n equipmentType: z\n .object({ equipmentTypeKey: z.string().nullable().optional() })\n .passthrough()\n .nullable()\n .optional(),\n })\n .passthrough();\n\ntype ParsedExecutableStep = z.infer<typeof executableStepParseSchema>;\n\ntype ParsedRepeatGroup = {\n type: \"RepeatGroupDTO\";\n numberOfIterations: number;\n workoutSteps: ParsedWorkoutStep[];\n};\n\ntype ParsedWorkoutStep = ParsedExecutableStep | ParsedRepeatGroup;\n\nconst repeatGroupParseSchema: z.ZodType<ParsedRepeatGroup> = z.lazy(() =>\n z\n .object({\n type: z.literal(\"RepeatGroupDTO\"),\n numberOfIterations: z.number(),\n workoutSteps: z.array(workoutStepParseSchema),\n })\n .passthrough()\n);\n\nconst workoutStepParseSchema: z.ZodType<ParsedWorkoutStep> = z.lazy(() =>\n z.union([executableStepParseSchema, repeatGroupParseSchema])\n);\n\nconst garminWorkoutParseSchema = z.object({\n sportType: z\n .object({ sportTypeKey: z.string() })\n .passthrough()\n .nullable()\n .optional(),\n workoutName: z.string().optional(),\n workoutSegments: z\n .array(\n z\n .object({\n workoutSteps: z.array(workoutStepParseSchema).optional(),\n })\n .passthrough()\n )\n .optional(),\n poolLength: z.number().nullable().optional(),\n});\n\ntype GarminWorkoutParsed = z.infer<typeof garminWorkoutParseSchema>;\n\nexport const convertGarminToKRD = (gcnString: string, logger: Logger): KRD => {\n logger.info(\"Parsing Garmin Connect JSON\");\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(gcnString);\n } catch (error) {\n throw createGarminParsingError(\"Invalid JSON in GCN file\", error);\n }\n\n const result = garminWorkoutParseSchema.safeParse(parsed);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n throw createGarminParsingError(`Invalid GCN data: ${issues}`);\n }\n\n const gcn = result.data;\n const sport = mapGarminSportToKrd(gcn.sportType?.sportTypeKey ?? \"\");\n const workoutName = gcn.workoutName ?? \"\";\n const segments = gcn.workoutSegments ?? [];\n const steps = flattenSegmentsToSteps(segments, logger);\n\n const workout: Workout = {\n name: workoutName.substring(0, 255),\n sport,\n steps,\n };\n\n addPoolLength(gcn, workout);\n\n const now = new Date().toISOString();\n return {\n version: \"1.0\",\n type: \"structured_workout\",\n metadata: { created: now, sport, manufacturer: \"garmin-connect\" },\n extensions: { structured_workout: workout },\n };\n};\n\ntype ParsedSegment = NonNullable<\n GarminWorkoutParsed[\"workoutSegments\"]\n>[number];\n\nconst flattenSegmentsToSteps = (\n segments: ParsedSegment[],\n logger: Logger\n): Array<WorkoutStep | RepetitionBlock> => {\n const allSteps: Array<WorkoutStep | RepetitionBlock> = [];\n let stepIndex = 0;\n\n for (const segment of segments) {\n for (const step of segment.workoutSteps ?? []) {\n if (step.type === \"RepeatGroupDTO\") {\n const block = mapRepeatGroup(step, stepIndex, logger);\n stepIndex += block.steps.length;\n allSteps.push(block);\n } else {\n allSteps.push(mapExecutableStep(step, stepIndex));\n stepIndex++;\n }\n }\n }\n\n return allSteps;\n};\n\nconst mapExecutableStep = (\n step: ParsedExecutableStep,\n stepIndex: number\n): WorkoutStep => {\n const { durationType, duration } = mapConditionToDuration(\n step.endCondition.conditionTypeKey,\n step.endConditionValue\n );\n\n const { targetType, target } = resolveTarget(step);\n const intensity = mapStepTypeToIntensity(step.stepType.stepTypeKey);\n const equipment = mapGarminEquipmentToKrd(\n step.equipmentType?.equipmentTypeKey ?? null\n );\n const stroke = mapGarminStrokeToKrd(\n step.strokeType?.strokeTypeKey ?? null,\n step.strokeType?.strokeTypeId ?? 0\n );\n\n const result: WorkoutStep = {\n stepIndex,\n durationType,\n duration,\n targetType,\n target,\n intensity,\n };\n\n if (equipment) result.equipment = equipment;\n\n if (stroke) {\n result.targetType = \"stroke_type\";\n result.target = {\n type: \"stroke_type\",\n value: { unit: \"swim_stroke\", value: strokeToFitValue(stroke) },\n };\n }\n\n return result;\n};\n\nconst resolveTarget = (\n step: ParsedExecutableStep\n): { targetType: TargetType; target: Target } => {\n const primary = mapGarminTargetToKrd(\n step.targetType.workoutTargetTypeKey,\n step.targetValueOne ?? null,\n step.targetValueTwo ?? null,\n step.zoneNumber ?? null\n );\n\n if (step.secondaryTargetType && primary.targetType === \"open\") {\n return mapGarminTargetToKrd(\n step.secondaryTargetType.workoutTargetTypeKey,\n step.secondaryTargetValueOne ?? null,\n step.secondaryTargetValueTwo ?? null,\n step.secondaryZoneNumber ?? null\n );\n }\n\n return primary;\n};\n\nconst mapRepeatGroup = (\n group: ParsedRepeatGroup,\n startIndex: number,\n logger: Logger\n): RepetitionBlock => {\n const steps: WorkoutStep[] = [];\n let idx = startIndex;\n\n for (const step of group.workoutSteps) {\n if (step.type === \"ExecutableStepDTO\") {\n steps.push(mapExecutableStep(step, idx));\n idx++;\n } else {\n logger.warn(\"Nested repeat groups are flattened\", {\n iterations: step.numberOfIterations,\n });\n const nested = mapRepeatGroup(step, idx, logger);\n for (const s of nested.steps) {\n steps.push({ ...s, stepIndex: idx });\n idx++;\n }\n }\n }\n\n return { repeatCount: group.numberOfIterations, steps };\n};\n\nconst addPoolLength = (gcn: GarminWorkoutParsed, workout: Workout): void => {\n const poolLength = gcn.poolLength;\n if (poolLength && poolLength > 0) {\n workout.poolLength = poolLength;\n workout.poolLengthUnit = \"meters\";\n }\n};\n\nconst STROKE_TO_FIT: Record<string, number> = {\n freestyle: 0,\n backstroke: 1,\n breaststroke: 2,\n butterfly: 3,\n drill: 4,\n mixed: 5,\n im: 5,\n};\n\nconst strokeToFitValue = (stroke: string): number => STROKE_TO_FIT[stroke] ?? 0;\n","import type { Logger, TextReader } from \"@kaiord/core\";\nimport { convertGarminToKRD } from \"./converters/garmin-to-krd.converter\";\n\nexport const createGarminReader =\n (logger: Logger): TextReader =>\n async (gcnString: string) =>\n convertGarminToKRD(gcnString, logger);\n","import type {\n KRD,\n Logger,\n RepetitionBlock,\n Workout,\n WorkoutStep,\n} from \"@kaiord/core\";\nimport { createGarminParsingError, workoutSchema } from \"@kaiord/core\";\nimport { ConditionTypeId, StepTypeId } from \"../schemas/common\";\nimport type { GarminWorkoutStepInput } from \"../schemas/input/types\";\nimport { mapDurationToCondition } from \"../mappers/condition.mapper\";\nimport { mapKrdEquipmentToGarmin } from \"../mappers/equipment.mapper\";\nimport {\n mapIntensityToStepType,\n type StepTypeKey,\n} from \"../mappers/intensity.mapper\";\nimport { mapKrdSportToGarmin } from \"../mappers/sport.mapper\";\nimport { mapKrdStrokeToGarmin } from \"../mappers/stroke.mapper\";\nimport { mapKrdTargetToGarmin } from \"../mappers/target.mapper\";\n\nexport const convertKRDToGarmin = (krd: KRD, logger: Logger): string => {\n logger.info(\"Converting KRD to Garmin Connect JSON\");\n\n const workout = extractWorkout(krd);\n if (!workout) {\n throw createGarminParsingError(\"KRD does not contain a structured workout\");\n }\n\n const sportType = mapKrdSportToGarmin(workout.sport);\n const counter = { value: 1 };\n\n const workoutSteps: GarminWorkoutStepInput[] = workout.steps.map((step) =>\n isRepetitionBlock(step)\n ? mapRepetitionBlock(step, counter)\n : mapWorkoutStep(step, counter)\n );\n\n const input = {\n sportType,\n workoutName: (workout.name ?? \"Kaiord Workout\").substring(0, 255),\n workoutSegments: [\n {\n segmentOrder: 1,\n sportType,\n workoutSteps,\n },\n ],\n poolLength: undefined as number | undefined,\n poolLengthUnit: undefined as\n | { unitId: number; unitKey: string; factor: number }\n | undefined,\n };\n\n addPoolInfo(workout, input);\n\n logger.info(\"KRD to Garmin GCN conversion complete\");\n return JSON.stringify(input, null, 2);\n};\n\nconst extractWorkout = (krd: KRD): Workout | undefined => {\n const ext = krd.extensions?.structured_workout;\n if (!ext || typeof ext !== \"object\") return undefined;\n\n const result = workoutSchema.safeParse(ext);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n throw createGarminParsingError(`Invalid workout data: ${issues}`);\n }\n\n return result.data;\n};\n\nconst isRepetitionBlock = (\n step: WorkoutStep | RepetitionBlock\n): step is RepetitionBlock => \"repeatCount\" in step;\n\nconst STEP_TYPE_IDS: Record<StepTypeKey, number> = {\n warmup: StepTypeId.WARMUP,\n cooldown: StepTypeId.COOLDOWN,\n interval: StepTypeId.INTERVAL,\n recovery: StepTypeId.RECOVERY,\n rest: StepTypeId.REST,\n};\n\nconst STEP_TYPE_ORDER: Record<StepTypeKey, number> = {\n warmup: 1,\n cooldown: 2,\n interval: 3,\n recovery: 4,\n rest: 5,\n};\n\nconst getStepTypeInfo = (intensity: string) => {\n const key = mapIntensityToStepType(intensity);\n return {\n stepTypeId: STEP_TYPE_IDS[key],\n stepTypeKey: key,\n displayOrder: STEP_TYPE_ORDER[key],\n };\n};\n\nconst mapWorkoutStep = (\n step: WorkoutStep,\n counter: { value: number }\n): GarminWorkoutStepInput => {\n const stepOrder = counter.value++;\n const stepType = getStepTypeInfo(step.intensity ?? \"active\");\n const { endCondition, endConditionValue } = mapDurationToCondition(\n step.durationType,\n step.duration\n );\n const { targetType, targetValueOne, targetValueTwo, zoneNumber } =\n mapKrdTargetToGarmin(step.target);\n\n const strokeType =\n step.target.type === \"stroke_type\"\n ? mapKrdStrokeToGarmin(fitValueToStroke(extractStrokeValue(step.target)))\n : mapKrdStrokeToGarmin(undefined);\n\n const equipmentType = mapKrdEquipmentToGarmin(step.equipment);\n\n return {\n type: \"ExecutableStepDTO\",\n stepOrder,\n stepType,\n endCondition,\n endConditionValue,\n targetType,\n targetValueOne,\n targetValueTwo,\n zoneNumber,\n secondaryTargetType: null,\n secondaryTargetValueOne: null,\n secondaryTargetValueTwo: null,\n secondaryZoneNumber: null,\n strokeType,\n equipmentType,\n };\n};\n\nconst mapRepetitionBlock = (\n block: RepetitionBlock,\n counter: { value: number }\n): GarminWorkoutStepInput => {\n const stepOrder = counter.value++;\n const innerSteps: GarminWorkoutStepInput[] = block.steps.map((step) =>\n mapWorkoutStep(step, counter)\n );\n\n return {\n type: \"RepeatGroupDTO\",\n stepOrder,\n stepType: {\n stepTypeId: StepTypeId.REPEAT,\n stepTypeKey: \"repeat\",\n displayOrder: 6,\n },\n numberOfIterations: block.repeatCount,\n endCondition: {\n conditionTypeId: ConditionTypeId.ITERATIONS,\n conditionTypeKey: \"iterations\",\n displayOrder: 7,\n displayable: false,\n },\n endConditionValue: block.repeatCount,\n workoutSteps: innerSteps,\n };\n};\n\ntype PoolInput = {\n poolLength?: number;\n poolLengthUnit?: { unitId: number; unitKey: string; factor: number };\n};\n\nconst addPoolInfo = (workout: Workout, input: PoolInput): void => {\n if (workout.poolLength && workout.poolLength > 0) {\n input.poolLength = workout.poolLength;\n input.poolLengthUnit = {\n unitId: 1,\n unitKey: \"meter\",\n factor: 100,\n };\n }\n};\n\nconst FIT_TO_STROKE: Record<number, string> = {\n 0: \"freestyle\",\n 1: \"backstroke\",\n 2: \"breaststroke\",\n 3: \"butterfly\",\n 4: \"drill\",\n 5: \"mixed\",\n};\n\nconst extractStrokeValue = (target: { value?: { value: number } }): number => {\n return target.value?.value ?? 0;\n};\n\nconst fitValueToStroke = (value: number): string | undefined =>\n FIT_TO_STROKE[value];\n","import type { Logger, TextWriter } from \"@kaiord/core\";\nimport { convertKRDToGarmin } from \"./converters/krd-to-garmin.converter\";\n\nexport const createGarminWriter =\n (logger: Logger): TextWriter =>\n async (krd) =>\n convertKRDToGarmin(krd, logger);\n","import type { Logger } from \"@kaiord/core\";\nimport { createConsoleLogger, createWorkoutKRD, toText } from \"@kaiord/core\";\nimport { createGarminWriter } from \"./garmin-writer\";\n\n/**\n * Creates a function that converts a Workout directly to Garmin Connect JSON.\n *\n * Composition facade: wraps application-layer orchestration (toText) with\n * the garmin writer. This is a convenience for consumers who don't need\n * the intermediate KRD step.\n *\n * Input is validated against workoutSchema.\n * Throws KrdValidationError if the workout structure is invalid.\n *\n * @param logger - Optional logger (defaults to console logger)\n * @returns Function that converts unknown workout data to Garmin JSON string\n */\nexport const createWorkoutToGarmin =\n (logger?: Logger) =>\n async (workout: unknown): Promise<string> => {\n const log = logger ?? createConsoleLogger();\n const krd = createWorkoutKRD(workout);\n return toText(krd, createGarminWriter(log), log);\n };\n\n/**\n * Converts a Workout directly to Garmin Connect JSON format.\n * Pre-built instance using the default console logger.\n */\nexport const workoutToGarmin = createWorkoutToGarmin();\n","/**\n * @kaiord/garmin - Garmin Connect API (GCN) format adapter for Kaiord\n */\n\nimport type { Logger, TextReader, TextWriter } from \"@kaiord/core\";\nimport { createConsoleLogger } from \"@kaiord/core\";\nimport { createGarminReader as createGarminReaderImpl } from \"./adapters/garmin-reader\";\nimport { createGarminWriter as createGarminWriterImpl } from \"./adapters/garmin-writer\";\n\nexport const createGarminReader = (logger?: Logger): TextReader =>\n createGarminReaderImpl(logger || createConsoleLogger());\n\nexport const createGarminWriter = (logger?: Logger): TextWriter =>\n createGarminWriterImpl(logger || createConsoleLogger());\n\nexport const garminReader: TextReader = createGarminReader();\nexport const garminWriter: TextWriter = createGarminWriter();\n\nexport {\n createWorkoutToGarmin,\n workoutToGarmin,\n} from \"./adapters/workout-to-garmin\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaiord/garmin",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"description": "Garmin Connect API (GCN) format adapter for the Kaiord health & fitness data framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"zod": "^
|
|
20
|
-
"@kaiord/core": "^4.
|
|
19
|
+
"zod": "^4.0.0",
|
|
20
|
+
"@kaiord/core": "^4.5.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/node": "^24.0.0",
|