@kaiord/zwo 4.8.1 → 7.1.1
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/browser.d.ts +1 -1
- package/dist/browser.js +70 -56
- package/dist/browser.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +70 -56
- package/dist/index.js.map +1 -1
- package/package.json +13 -9
- package/schema/zwift-workout.xsd +119 -0
package/dist/index.js
CHANGED
|
@@ -2,6 +2,27 @@ import { createConsoleLogger, createZwiftParsingError, createZwiftValidationErro
|
|
|
2
2
|
import { XMLParser, XMLValidator, XMLBuilder } from 'fast-xml-parser';
|
|
3
3
|
|
|
4
4
|
// src/index.ts
|
|
5
|
+
var detectIntervalType = (step) => {
|
|
6
|
+
if (step.target.type === targetTypeSchema.enum.open) {
|
|
7
|
+
return "FreeRide";
|
|
8
|
+
}
|
|
9
|
+
if (step.target.type === targetTypeSchema.enum.power) {
|
|
10
|
+
const powerValue = step.target.value;
|
|
11
|
+
if (powerValue.unit === targetUnitSchema.enum.range) {
|
|
12
|
+
if (step.intensity === intensitySchema.enum.warmup) {
|
|
13
|
+
return "Warmup";
|
|
14
|
+
}
|
|
15
|
+
if (step.intensity === intensitySchema.enum.cooldown) {
|
|
16
|
+
return "Cooldown";
|
|
17
|
+
}
|
|
18
|
+
return "Ramp";
|
|
19
|
+
}
|
|
20
|
+
if (powerValue.unit === targetUnitSchema.enum.percent_ftp || powerValue.unit === targetUnitSchema.enum.watts) {
|
|
21
|
+
return "SteadyState";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return "SteadyState";
|
|
25
|
+
};
|
|
5
26
|
|
|
6
27
|
// src/adapters/krd-to-zwift/text-events-encoder.ts
|
|
7
28
|
var encodeTextEvents = (step) => {
|
|
@@ -58,24 +79,26 @@ var encodePowerTargets = (onStep, offStep, intervalsT) => {
|
|
|
58
79
|
intervalsT["@_OffPower"] = offStep.target.value.value / 100;
|
|
59
80
|
}
|
|
60
81
|
};
|
|
61
|
-
var
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (cadence !== void 0) {
|
|
68
|
-
intervalsT["@_Cadence"] = cadence;
|
|
82
|
+
var resolveStepCadence = (step) => {
|
|
83
|
+
if (step.target.type === "cadence") {
|
|
84
|
+
const val = step.target.value;
|
|
85
|
+
if (val.unit === "rpm") return val.value;
|
|
86
|
+
if (val.unit === "range" && val.min !== void 0 && val.max !== void 0) {
|
|
87
|
+
return Math.round((val.min + val.max) / 2);
|
|
69
88
|
}
|
|
70
89
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
90
|
+
const zwift = step.extensions ? step.extensions.zwift : void 0;
|
|
91
|
+
const ext = zwift;
|
|
92
|
+
return ext ? ext.cadence : void 0;
|
|
93
|
+
};
|
|
94
|
+
var encodeCadenceTargets = (onStep, offStep, intervalsT) => {
|
|
95
|
+
const cadence = resolveStepCadence(onStep);
|
|
96
|
+
if (cadence !== void 0) {
|
|
97
|
+
intervalsT["@_Cadence"] = cadence;
|
|
98
|
+
}
|
|
99
|
+
const cadenceResting = resolveStepCadence(offStep);
|
|
100
|
+
if (cadenceResting !== void 0) {
|
|
101
|
+
intervalsT["@_CadenceResting"] = cadenceResting;
|
|
79
102
|
}
|
|
80
103
|
};
|
|
81
104
|
var encodeIntervalsT = (repetitionBlock) => {
|
|
@@ -180,6 +203,16 @@ var encodeMetadata = (step, interval) => {
|
|
|
180
203
|
interval["@_kaiord:equipment"] = step.equipment;
|
|
181
204
|
}
|
|
182
205
|
};
|
|
206
|
+
var convertZwiftCadenceTarget = (cadence, isRunning = false) => {
|
|
207
|
+
const rpm = isRunning ? cadence / 2 : cadence;
|
|
208
|
+
return {
|
|
209
|
+
type: targetTypeSchema.enum.cadence,
|
|
210
|
+
value: {
|
|
211
|
+
unit: "rpm",
|
|
212
|
+
value: rpm
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
};
|
|
183
216
|
var convertZwiftPowerTarget = (ftpPercentage) => {
|
|
184
217
|
return {
|
|
185
218
|
type: targetTypeSchema.enum.power,
|
|
@@ -211,16 +244,6 @@ var convertPowerZoneToPercentFtp = (zone) => {
|
|
|
211
244
|
};
|
|
212
245
|
return zoneMap[zone] || 100;
|
|
213
246
|
};
|
|
214
|
-
var convertZwiftCadenceTarget = (cadence, isRunning = false) => {
|
|
215
|
-
const rpm = isRunning ? cadence / 2 : cadence;
|
|
216
|
-
return {
|
|
217
|
-
type: targetTypeSchema.enum.cadence,
|
|
218
|
-
value: {
|
|
219
|
-
unit: "rpm",
|
|
220
|
-
value: rpm
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
};
|
|
224
247
|
|
|
225
248
|
// src/adapters/krd-to-zwift/power-encoder.ts
|
|
226
249
|
var encodeSteadyStatePowerTarget = (step, interval) => {
|
|
@@ -327,27 +350,6 @@ var convertStepToInterval = (step, intervalType, logger) => {
|
|
|
327
350
|
}
|
|
328
351
|
return interval;
|
|
329
352
|
};
|
|
330
|
-
var detectIntervalType = (step) => {
|
|
331
|
-
if (step.target.type === targetTypeSchema.enum.open) {
|
|
332
|
-
return "FreeRide";
|
|
333
|
-
}
|
|
334
|
-
if (step.target.type === targetTypeSchema.enum.power) {
|
|
335
|
-
const powerValue = step.target.value;
|
|
336
|
-
if (powerValue.unit === targetUnitSchema.enum.range) {
|
|
337
|
-
if (step.intensity === intensitySchema.enum.warmup) {
|
|
338
|
-
return "Warmup";
|
|
339
|
-
}
|
|
340
|
-
if (step.intensity === intensitySchema.enum.cooldown) {
|
|
341
|
-
return "Cooldown";
|
|
342
|
-
}
|
|
343
|
-
return "Ramp";
|
|
344
|
-
}
|
|
345
|
-
if (powerValue.unit === targetUnitSchema.enum.percent_ftp || powerValue.unit === targetUnitSchema.enum.watts) {
|
|
346
|
-
return "SteadyState";
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
return "SteadyState";
|
|
350
|
-
};
|
|
351
353
|
|
|
352
354
|
// src/adapters/krd-to-zwift/intervals-encoder.ts
|
|
353
355
|
var convertStepsToZwiftIntervals = (steps, logger) => {
|
|
@@ -425,7 +427,13 @@ var mapSportType = (sport) => {
|
|
|
425
427
|
};
|
|
426
428
|
|
|
427
429
|
// src/adapters/krd-to-zwift/workout-file-builder.ts
|
|
428
|
-
var buildWorkoutFile = (
|
|
430
|
+
var buildWorkoutFile = ({
|
|
431
|
+
workoutData,
|
|
432
|
+
zwiftExtensions,
|
|
433
|
+
metadata,
|
|
434
|
+
fitExtensions,
|
|
435
|
+
logger
|
|
436
|
+
}) => {
|
|
429
437
|
const workoutFile = {};
|
|
430
438
|
addWorkoutProperties(workoutFile, workoutData.name, zwiftExtensions);
|
|
431
439
|
workoutFile.sportType = mapSportType(workoutData.sport);
|
|
@@ -470,13 +478,13 @@ var convertKRDToZwift = (krd, logger) => {
|
|
|
470
478
|
logger.debug("Building Zwift workout structure from KRD");
|
|
471
479
|
const workoutData = extractWorkoutData(krd);
|
|
472
480
|
const zwiftExtensions = krd.extensions?.zwift || {};
|
|
473
|
-
const workoutFile = buildWorkoutFile(
|
|
481
|
+
const workoutFile = buildWorkoutFile({
|
|
474
482
|
workoutData,
|
|
475
483
|
zwiftExtensions,
|
|
476
|
-
krd.metadata,
|
|
477
|
-
krd.extensions?.fit,
|
|
484
|
+
metadata: krd.metadata,
|
|
485
|
+
fitExtensions: krd.extensions?.fit,
|
|
478
486
|
logger
|
|
479
|
-
);
|
|
487
|
+
});
|
|
480
488
|
const xmlString = buildXmlString(workoutFile);
|
|
481
489
|
logger.debug("Zwift XML structure built successfully");
|
|
482
490
|
return xmlString;
|
|
@@ -552,25 +560,31 @@ var extractTags = (tags) => {
|
|
|
552
560
|
const tagArray = Array.isArray(tags.tag) ? tags.tag : [tags.tag];
|
|
553
561
|
return tagArray.map((t) => t["@_name"]);
|
|
554
562
|
};
|
|
555
|
-
var
|
|
556
|
-
|
|
563
|
+
var mapOriginalDurationType = (data) => {
|
|
564
|
+
const orig = data["kaiord:originalDurationType"];
|
|
565
|
+
if (orig === "distance") {
|
|
557
566
|
return {
|
|
558
567
|
type: durationTypeSchema.enum.distance,
|
|
559
568
|
meters: data["kaiord:originalDurationMeters"] || data.Duration || 0
|
|
560
569
|
};
|
|
561
570
|
}
|
|
562
|
-
if (
|
|
571
|
+
if (orig === "heart_rate_less_than") {
|
|
563
572
|
return {
|
|
564
573
|
type: durationTypeSchema.enum.heart_rate_less_than,
|
|
565
574
|
bpm: data["kaiord:originalDurationBpm"] || 0
|
|
566
575
|
};
|
|
567
576
|
}
|
|
568
|
-
if (
|
|
577
|
+
if (orig === "power_less_than") {
|
|
569
578
|
return {
|
|
570
579
|
type: durationTypeSchema.enum.power_less_than,
|
|
571
580
|
watts: data["kaiord:originalDurationWatts"] || 0
|
|
572
581
|
};
|
|
573
582
|
}
|
|
583
|
+
return void 0;
|
|
584
|
+
};
|
|
585
|
+
var mapZwiftDuration = (data) => {
|
|
586
|
+
const original = mapOriginalDurationType(data);
|
|
587
|
+
if (original) return original;
|
|
574
588
|
if (data.Duration === void 0 || data.Duration <= 0) {
|
|
575
589
|
return { type: durationTypeSchema.enum.open };
|
|
576
590
|
}
|