@kaiord/garmin 4.1.0 → 4.1.3
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/README.md +72 -0
- package/dist/index.d.ts +9 -10
- package/dist/index.js +8 -11
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# @kaiord/garmin
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@kaiord/garmin)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
Garmin Connect API format adapter for the Kaiord health & fitness data framework. Provides bidirectional conversion between Garmin Connect workout JSON format and KRD.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pnpm add @kaiord/core @kaiord/garmin
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
### With Core Providers (Recommended)
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { createDefaultProviders } from "@kaiord/core";
|
|
20
|
+
import { createGarminProviders } from "@kaiord/garmin";
|
|
21
|
+
|
|
22
|
+
const providers = createDefaultProviders({
|
|
23
|
+
garmin: createGarminProviders(),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Garmin to KRD
|
|
27
|
+
const krd = await providers.convertGarminToKrd!({ garminString });
|
|
28
|
+
|
|
29
|
+
// KRD to Garmin
|
|
30
|
+
const garminString = await providers.convertKrdToGarmin!({ krd });
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Standalone Adapter Access
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import {
|
|
37
|
+
createGarminConnectReader,
|
|
38
|
+
createGarminConnectWriter,
|
|
39
|
+
} from "@kaiord/garmin";
|
|
40
|
+
import { createConsoleLogger } from "@kaiord/core";
|
|
41
|
+
|
|
42
|
+
const logger = createConsoleLogger();
|
|
43
|
+
const reader = createGarminConnectReader(logger);
|
|
44
|
+
const writer = createGarminConnectWriter(logger);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## API
|
|
48
|
+
|
|
49
|
+
### `createGarminProviders(logger?: Logger): GarminProviders`
|
|
50
|
+
|
|
51
|
+
Creates Garmin adapter instances for use with `createDefaultProviders()`.
|
|
52
|
+
|
|
53
|
+
### `createGarminConnectReader(logger: Logger): GarminReader`
|
|
54
|
+
|
|
55
|
+
Creates a Garmin Connect JSON reader.
|
|
56
|
+
|
|
57
|
+
### `createGarminConnectWriter(logger: Logger): GarminWriter`
|
|
58
|
+
|
|
59
|
+
Creates a Garmin Connect JSON writer.
|
|
60
|
+
|
|
61
|
+
## Supported Garmin Features
|
|
62
|
+
|
|
63
|
+
- Workout definitions with structured steps
|
|
64
|
+
- Power, heart rate, speed, and cadence targets
|
|
65
|
+
- Time-based, distance-based, and calorie-based durations
|
|
66
|
+
- Repeat blocks (intervals)
|
|
67
|
+
- Multiple sport types
|
|
68
|
+
- Custom step names and notes
|
|
69
|
+
|
|
70
|
+
## License
|
|
71
|
+
|
|
72
|
+
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { Logger,
|
|
1
|
+
import { Logger, TextReader, TextWriter } from '@kaiord/core';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
7
|
-
declare const createGarminProviders: (logger?: Logger) => GarminProviders;
|
|
3
|
+
/**
|
|
4
|
+
* @kaiord/garmin - Garmin Connect API (GCN) format adapter for Kaiord
|
|
5
|
+
*/
|
|
8
6
|
|
|
9
|
-
declare const createGarminReader: (logger
|
|
7
|
+
declare const createGarminReader: (logger?: Logger) => TextReader;
|
|
8
|
+
declare const createGarminWriter: (logger?: Logger) => TextWriter;
|
|
9
|
+
declare const garminReader: TextReader;
|
|
10
|
+
declare const garminWriter: TextWriter;
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export { type GarminProviders, createGarminProviders, createGarminReader, createGarminWriter };
|
|
12
|
+
export { createGarminReader, createGarminWriter, garminReader, garminWriter };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createConsoleLogger, createGarminParsingError } from '@kaiord/core';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
|
-
// src/
|
|
4
|
+
// src/index.ts
|
|
5
5
|
var ConditionTypeId = {
|
|
6
6
|
LAP_BUTTON: 1,
|
|
7
7
|
TIME: 2,
|
|
@@ -793,15 +793,12 @@ var fitValueToStroke = (value) => FIT_TO_STROKE[value];
|
|
|
793
793
|
// src/adapters/garmin-writer.ts
|
|
794
794
|
var createGarminWriter = (logger) => async (krd) => convertKRDToGarmin(krd, logger);
|
|
795
795
|
|
|
796
|
-
// src/
|
|
797
|
-
var
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
garminWriter: createGarminWriter(log)
|
|
802
|
-
};
|
|
803
|
-
};
|
|
796
|
+
// src/index.ts
|
|
797
|
+
var createGarminReader2 = (logger) => createGarminReader(logger || createConsoleLogger());
|
|
798
|
+
var createGarminWriter2 = (logger) => createGarminWriter(logger || createConsoleLogger());
|
|
799
|
+
var garminReader = createGarminReader2();
|
|
800
|
+
var garminWriter = createGarminWriter2();
|
|
804
801
|
|
|
805
|
-
export {
|
|
802
|
+
export { createGarminReader2 as createGarminReader, createGarminWriter2 as createGarminWriter, garminReader, garminWriter };
|
|
806
803
|
//# sourceMappingURL=index.js.map
|
|
807
804
|
//# sourceMappingURL=index.js.map
|
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/providers.ts"],"names":["z","createGarminParsingError"],"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 { GarminSportType } from \"../schemas/common\";\nimport { SportTypeId } from \"../schemas/common\";\n\nconst GARMIN_TO_KRD_SPORT: Record<string, string> = {\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): string =>\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 { GarminReader, Logger } from \"@kaiord/core\";\nimport { convertGarminToKRD } from \"./converters/garmin-to-krd.converter\";\n\nexport const createGarminReader =\n (logger: Logger): GarminReader =>\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 { GarminWriter, Logger } from \"@kaiord/core\";\nimport { convertKRDToGarmin } from \"./converters/krd-to-garmin.converter\";\n\nexport const createGarminWriter =\n (logger: Logger): GarminWriter =>\n async (krd) =>\n convertKRDToGarmin(krd, logger);\n","import type { GarminReader, GarminWriter, Logger } from \"@kaiord/core\";\nimport { createConsoleLogger } from \"@kaiord/core\";\nimport { createGarminReader } from \"./adapters/garmin-reader\";\nimport { createGarminWriter } from \"./adapters/garmin-writer\";\n\nexport type GarminProviders = {\n garminReader: GarminReader;\n garminWriter: GarminWriter;\n};\n\nexport const createGarminProviders = (logger?: Logger): GarminProviders => {\n const log = logger || createConsoleLogger();\n\n return {\n garminReader: createGarminReader(log),\n garminWriter: createGarminWriter(log),\n };\n};\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/index.ts"],"names":["z","createGarminParsingError","createGarminReader","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 { GarminSportType } from \"../schemas/common\";\nimport { SportTypeId } from \"../schemas/common\";\n\nconst GARMIN_TO_KRD_SPORT: Record<string, string> = {\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): string =>\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","/**\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"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaiord/garmin",
|
|
3
|
-
"version": "4.1.
|
|
4
|
-
"description": "Garmin Connect API (GCN) format adapter for Kaiord
|
|
3
|
+
"version": "4.1.3",
|
|
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",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"zod": "^3.22.4",
|
|
20
|
-
"@kaiord/core": "^4.1.
|
|
20
|
+
"@kaiord/core": "^4.1.3"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/node": "^24.0.0",
|