@aneuhold/core-ts-db-lib 4.1.11 → 4.1.12
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/CHANGELOG.md +23 -0
- package/lib/browser.d.ts +9 -3
- package/lib/browser.d.ts.map +1 -1
- package/lib/browser.js +4 -1
- package/lib/browser.js.map +1 -1
- package/lib/browser.ts +13 -5
- package/lib/ctos/workout/WorkoutExerciseCTO.d.ts +121 -0
- package/lib/ctos/workout/WorkoutExerciseCTO.d.ts.map +1 -0
- package/lib/ctos/workout/WorkoutExerciseCTO.js +58 -0
- package/lib/ctos/workout/WorkoutExerciseCTO.js.map +1 -0
- package/lib/ctos/workout/WorkoutExerciseCTO.ts +71 -0
- package/lib/ctos/workout/WorkoutMuscleGroupVolumeCTO.d.ts +36 -0
- package/lib/ctos/workout/WorkoutMuscleGroupVolumeCTO.d.ts.map +1 -0
- package/lib/ctos/workout/WorkoutMuscleGroupVolumeCTO.js +21 -0
- package/lib/ctos/workout/WorkoutMuscleGroupVolumeCTO.js.map +1 -0
- package/lib/ctos/workout/WorkoutMuscleGroupVolumeCTO.ts +29 -0
- package/lib/documents/workout/README.md +5 -5
- package/lib/documents/workout/WorkoutExerciseCalibration.d.ts +1 -8
- package/lib/documents/workout/WorkoutExerciseCalibration.d.ts.map +1 -1
- package/lib/documents/workout/WorkoutExerciseCalibration.js +12 -1
- package/lib/documents/workout/WorkoutExerciseCalibration.js.map +1 -1
- package/lib/documents/workout/WorkoutExerciseCalibration.ts +12 -10
- package/lib/documents/workout/WorkoutSessionExercise.js +4 -4
- package/lib/documents/workout/WorkoutSessionExercise.ts +4 -4
- package/lib/embedded-types/workout/MesocycleVolumeSummary.d.ts +27 -0
- package/lib/embedded-types/workout/MesocycleVolumeSummary.d.ts.map +1 -0
- package/lib/embedded-types/workout/MesocycleVolumeSummary.js +39 -0
- package/lib/embedded-types/workout/MesocycleVolumeSummary.js.map +1 -0
- package/lib/embedded-types/workout/MesocycleVolumeSummary.ts +55 -0
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.d.ts +33 -2
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.d.ts.map +1 -1
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.js +55 -4
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.js.map +1 -1
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.ts +69 -4
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts +8 -9
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts.map +1 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js +24 -25
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js.map +1 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.ts +29 -35
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.d.ts +4 -9
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.d.ts.map +1 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js +12 -8
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js.map +1 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.ts +17 -17
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.d.ts +3 -6
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.d.ts.map +1 -1
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.js +22 -34
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.js.map +1 -1
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.ts +30 -52
- package/lib/services/workout/Session/WorkoutSessionService.d.ts +7 -7
- package/lib/services/workout/Session/WorkoutSessionService.d.ts.map +1 -1
- package/lib/services/workout/Session/WorkoutSessionService.js +32 -31
- package/lib/services/workout/Session/WorkoutSessionService.js.map +1 -1
- package/lib/services/workout/Session/WorkoutSessionService.ts +38 -36
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts +3 -3
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts.map +1 -1
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js +4 -4
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js.map +1 -1
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.ts +4 -4
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.js +21 -21
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.js.map +1 -1
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.ts +22 -22
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkoutSessionExerciseService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/SessionExercise/WorkoutSessionExerciseService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AACnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAG3E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,6BAA6B;IAChD;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAI1E;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAI9E;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAIrE;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI;IAqC7D;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,oCAAoC,CACzC,sBAAsB,EAAE,sBAAsB,GAC7C,MAAM,GAAG,IAAI;IAsBhB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO;IAI5D;;;;;OAKG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAe,EAAE,sBAAsB,EACvC,YAAY,EAAE,UAAU,EAAE,GACzB,OAAO;
|
|
1
|
+
{"version":3,"file":"WorkoutSessionExerciseService.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/SessionExercise/WorkoutSessionExerciseService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AACnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAG3E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,6BAA6B;IAChD;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAI1E;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAI9E;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI;IAIrE;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI;IAqC7D;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,oCAAoC,CACzC,sBAAsB,EAAE,sBAAsB,GAC7C,MAAM,GAAG,IAAI;IAsBhB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO;IAI5D;;;;;OAKG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAe,EAAE,sBAAsB,EACvC,YAAY,EAAE,UAAU,EAAE,GACzB,OAAO;IAUV;;;;OAIG;IACH,MAAM,CAAC,0BAA0B,CAC/B,eAAe,EAAE,sBAAsB,EACvC,YAAY,EAAE,UAAU,EAAE,GACzB,OAAO;CAYX"}
|
|
@@ -117,7 +117,7 @@ export default class WorkoutSessionExerciseService {
|
|
|
117
117
|
/**
|
|
118
118
|
* Returns true if all mid-session metrics are filled out for the session exercise.
|
|
119
119
|
* Mid-session metrics are filled out right after performing the exercise:
|
|
120
|
-
* mindMuscleConnection, pump, unusedMusclePerformance,
|
|
120
|
+
* mindMuscleConnection, pump, unusedMusclePerformance,
|
|
121
121
|
* and performanceScore. Deload exercises are always considered filled.
|
|
122
122
|
*/
|
|
123
123
|
static hasMidSessionMetricsFilled(sessionExercise, exerciseSets) {
|
|
@@ -126,13 +126,12 @@ export default class WorkoutSessionExerciseService {
|
|
|
126
126
|
return (sessionExercise.rsm?.mindMuscleConnection != null &&
|
|
127
127
|
sessionExercise.rsm.pump != null &&
|
|
128
128
|
sessionExercise.fatigue?.unusedMusclePerformance != null &&
|
|
129
|
-
sessionExercise.fatigue.perceivedEffort != null &&
|
|
130
129
|
sessionExercise.performanceScore != null);
|
|
131
130
|
}
|
|
132
131
|
/**
|
|
133
132
|
* Returns true if all session metrics (both mid-session and post-session) are filled out.
|
|
134
|
-
* Post-session metrics are disruption, jointAndTissueDisruption,
|
|
135
|
-
* Deload exercises are always considered filled.
|
|
133
|
+
* Post-session metrics are disruption, jointAndTissueDisruption, perceivedEffort,
|
|
134
|
+
* and sorenessScore. Deload exercises are always considered filled.
|
|
136
135
|
*/
|
|
137
136
|
static hasAllSessionMetricsFilled(sessionExercise, exerciseSets) {
|
|
138
137
|
if (!WorkoutSessionExerciseService.hasMidSessionMetricsFilled(sessionExercise, exerciseSets)) {
|
|
@@ -142,6 +141,7 @@ export default class WorkoutSessionExerciseService {
|
|
|
142
141
|
return true;
|
|
143
142
|
return (sessionExercise.rsm?.disruption != null &&
|
|
144
143
|
sessionExercise.fatigue?.jointAndTissueDisruption != null &&
|
|
144
|
+
sessionExercise.fatigue.perceivedEffort != null &&
|
|
145
145
|
sessionExercise.sorenessScore != null);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkoutSessionExerciseService.js","sourceRoot":"","sources":["../../../../src/services/workout/SessionExercise/WorkoutSessionExerciseService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"WorkoutSessionExerciseService.js","sourceRoot":"","sources":["../../../../src/services/workout/SessionExercise/WorkoutSessionExerciseService.ts"],"names":[],"mappings":"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"}
|
|
@@ -136,7 +136,7 @@ export default class WorkoutSessionExerciseService {
|
|
|
136
136
|
/**
|
|
137
137
|
* Returns true if all mid-session metrics are filled out for the session exercise.
|
|
138
138
|
* Mid-session metrics are filled out right after performing the exercise:
|
|
139
|
-
* mindMuscleConnection, pump, unusedMusclePerformance,
|
|
139
|
+
* mindMuscleConnection, pump, unusedMusclePerformance,
|
|
140
140
|
* and performanceScore. Deload exercises are always considered filled.
|
|
141
141
|
*/
|
|
142
142
|
static hasMidSessionMetricsFilled(
|
|
@@ -148,15 +148,14 @@ export default class WorkoutSessionExerciseService {
|
|
|
148
148
|
sessionExercise.rsm?.mindMuscleConnection != null &&
|
|
149
149
|
sessionExercise.rsm.pump != null &&
|
|
150
150
|
sessionExercise.fatigue?.unusedMusclePerformance != null &&
|
|
151
|
-
sessionExercise.fatigue.perceivedEffort != null &&
|
|
152
151
|
sessionExercise.performanceScore != null
|
|
153
152
|
);
|
|
154
153
|
}
|
|
155
154
|
|
|
156
155
|
/**
|
|
157
156
|
* Returns true if all session metrics (both mid-session and post-session) are filled out.
|
|
158
|
-
* Post-session metrics are disruption, jointAndTissueDisruption,
|
|
159
|
-
* Deload exercises are always considered filled.
|
|
157
|
+
* Post-session metrics are disruption, jointAndTissueDisruption, perceivedEffort,
|
|
158
|
+
* and sorenessScore. Deload exercises are always considered filled.
|
|
160
159
|
*/
|
|
161
160
|
static hasAllSessionMetricsFilled(
|
|
162
161
|
sessionExercise: WorkoutSessionExercise,
|
|
@@ -169,6 +168,7 @@ export default class WorkoutSessionExerciseService {
|
|
|
169
168
|
return (
|
|
170
169
|
sessionExercise.rsm?.disruption != null &&
|
|
171
170
|
sessionExercise.fatigue?.jointAndTissueDisruption != null &&
|
|
171
|
+
sessionExercise.fatigue.perceivedEffort != null &&
|
|
172
172
|
sessionExercise.sorenessScore != null
|
|
173
173
|
);
|
|
174
174
|
}
|
|
@@ -22,13 +22,13 @@ export default class WorkoutVolumePlanningService {
|
|
|
22
22
|
* Calculates the set plan for an entire microcycle.
|
|
23
23
|
*/
|
|
24
24
|
static calculateSetPlanForMicrocycle(context, microcycleIndex, isDeloadMicrocycle) {
|
|
25
|
-
if (!context.
|
|
26
|
-
throw new Error('WorkoutMesocyclePlanContext.
|
|
25
|
+
if (!context.muscleGroupToExerciseCTOsMap) {
|
|
26
|
+
throw new Error('WorkoutMesocyclePlanContext.muscleGroupToExerciseCTOsMap is not initialized. This should be set during mesocycle planning.');
|
|
27
27
|
}
|
|
28
28
|
const exerciseIdToSetCount = new Map();
|
|
29
29
|
const recoveryExerciseIds = new Set();
|
|
30
|
-
context.
|
|
31
|
-
const result = this.calculateSetCountForEachExerciseInMuscleGroup(context, microcycleIndex,
|
|
30
|
+
context.muscleGroupToExerciseCTOsMap.values().forEach((muscleGroupExerciseCTOs) => {
|
|
31
|
+
const result = this.calculateSetCountForEachExerciseInMuscleGroup(context, microcycleIndex, muscleGroupExerciseCTOs, isDeloadMicrocycle);
|
|
32
32
|
for (const [workoutExerciseId, setCount] of result.exerciseIdToSetCount) {
|
|
33
33
|
exerciseIdToSetCount.set(workoutExerciseId, setCount);
|
|
34
34
|
}
|
|
@@ -44,23 +44,23 @@ export default class WorkoutVolumePlanningService {
|
|
|
44
44
|
* If there is no previous microcycle data for the muscle group, this falls back to
|
|
45
45
|
* the baseline progression rules.
|
|
46
46
|
*/
|
|
47
|
-
static calculateSetCountForEachExerciseInMuscleGroup(context, microcycleIndex,
|
|
47
|
+
static calculateSetCountForEachExerciseInMuscleGroup(context, microcycleIndex, muscleGroupExerciseCTOs, isDeloadMicrocycle) {
|
|
48
48
|
const exerciseIdToSetCount = new Map();
|
|
49
49
|
const recoveryExerciseIds = new Set();
|
|
50
50
|
const sessionIndexToExerciseIds = new Map();
|
|
51
51
|
// 1. Calculate baselines for all exercises in muscle group
|
|
52
|
-
|
|
53
|
-
const baseline = this.calculateBaselineSetCount(microcycleIndex,
|
|
54
|
-
exerciseIdToSetCount.set(
|
|
52
|
+
muscleGroupExerciseCTOs.forEach((cto, index) => {
|
|
53
|
+
const baseline = this.calculateBaselineSetCount(microcycleIndex, muscleGroupExerciseCTOs.length, index, isDeloadMicrocycle);
|
|
54
|
+
exerciseIdToSetCount.set(cto._id, Math.min(baseline, this.MAX_SETS_PER_EXERCISE));
|
|
55
55
|
// Build out the map for session indices to the array of exercise IDs as it pertains to this
|
|
56
56
|
// muscle group.
|
|
57
57
|
if (!context.exerciseIdToSessionIndex)
|
|
58
58
|
return;
|
|
59
|
-
const exerciseSessionIndex = context.exerciseIdToSessionIndex.get(
|
|
59
|
+
const exerciseSessionIndex = context.exerciseIdToSessionIndex.get(cto._id);
|
|
60
60
|
if (exerciseSessionIndex === undefined)
|
|
61
61
|
return;
|
|
62
62
|
const existingExerciseIdsForSession = sessionIndexToExerciseIds.get(exerciseSessionIndex) || [];
|
|
63
|
-
existingExerciseIdsForSession.push(
|
|
63
|
+
existingExerciseIdsForSession.push(cto._id);
|
|
64
64
|
sessionIndexToExerciseIds.set(exerciseSessionIndex, existingExerciseIdsForSession);
|
|
65
65
|
});
|
|
66
66
|
// 2. Resolve historical performance data
|
|
@@ -70,7 +70,7 @@ export default class WorkoutVolumePlanningService {
|
|
|
70
70
|
if (!previousMicrocycle)
|
|
71
71
|
return { exerciseIdToSetCount, recoveryExerciseIds };
|
|
72
72
|
// Map previous session exercises
|
|
73
|
-
const exerciseIds = new Set(
|
|
73
|
+
const exerciseIds = new Set(muscleGroupExerciseCTOs.map((cto) => cto._id));
|
|
74
74
|
const exerciseIdToPrevSessionExercise = new Map();
|
|
75
75
|
const foundExerciseIds = new Set();
|
|
76
76
|
const exercisesThatWerePreviouslyInRecovery = new Set();
|
|
@@ -113,14 +113,14 @@ export default class WorkoutVolumePlanningService {
|
|
|
113
113
|
// For deload microcycles, halve the historical count (minimum 1 set). We don't use baseline
|
|
114
114
|
// because the user may have adjusted over the mesocycle in a way that the baseline is actually
|
|
115
115
|
// a higher set count than what would be calculated by halving the previous microcycle's sets.
|
|
116
|
-
|
|
117
|
-
const previousSessionExercise = exerciseIdToPrevSessionExercise.get(
|
|
116
|
+
muscleGroupExerciseCTOs.forEach((cto) => {
|
|
117
|
+
const previousSessionExercise = exerciseIdToPrevSessionExercise.get(cto._id);
|
|
118
118
|
if (previousSessionExercise) {
|
|
119
119
|
let setCount = Math.min(previousSessionExercise.setOrder.length, this.MAX_SETS_PER_EXERCISE);
|
|
120
120
|
if (isDeloadMicrocycle) {
|
|
121
121
|
setCount = Math.max(1, Math.floor(setCount / 2));
|
|
122
122
|
}
|
|
123
|
-
exerciseIdToSetCount.set(
|
|
123
|
+
exerciseIdToSetCount.set(cto._id, setCount);
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
126
|
// Deload microcycles use reduced volume — skip SFR-based set additions
|
|
@@ -150,12 +150,12 @@ export default class WorkoutVolumePlanningService {
|
|
|
150
150
|
// 3. Determine sets to add and valid candidates
|
|
151
151
|
let totalSetsToAdd = 0;
|
|
152
152
|
const candidates = [];
|
|
153
|
-
|
|
154
|
-
const previousSessionExercise = exerciseIdToPrevSessionExercise.get(
|
|
153
|
+
muscleGroupExerciseCTOs.forEach((cto, muscleGroupIndex) => {
|
|
154
|
+
const previousSessionExercise = exerciseIdToPrevSessionExercise.get(cto._id);
|
|
155
155
|
if (!previousSessionExercise)
|
|
156
156
|
return;
|
|
157
157
|
let recommendation;
|
|
158
|
-
if (!exercisesThatWerePreviouslyInRecovery.has(
|
|
158
|
+
if (!exercisesThatWerePreviouslyInRecovery.has(cto._id)) {
|
|
159
159
|
recommendation =
|
|
160
160
|
WorkoutSessionExerciseService.getRecommendedSetAdditionsOrRecovery(previousSessionExercise);
|
|
161
161
|
}
|
|
@@ -167,19 +167,19 @@ export default class WorkoutVolumePlanningService {
|
|
|
167
167
|
recommendation = 0;
|
|
168
168
|
}
|
|
169
169
|
if (recommendation === -1) {
|
|
170
|
-
recoveryExerciseIds.add(
|
|
170
|
+
recoveryExerciseIds.add(cto._id);
|
|
171
171
|
// Cut sets in half (rounded down, minimum 1) for recovery
|
|
172
172
|
const previousSetCount = previousSessionExercise.setOrder.length;
|
|
173
173
|
const recoverySets = Math.max(1, Math.floor(previousSetCount / 2));
|
|
174
|
-
exerciseIdToSetCount.set(
|
|
174
|
+
exerciseIdToSetCount.set(cto._id, recoverySets);
|
|
175
175
|
}
|
|
176
176
|
else if (recommendation != null && recommendation >= 0) {
|
|
177
177
|
totalSetsToAdd += recommendation;
|
|
178
178
|
// Consider as candidate if session is not already capped
|
|
179
179
|
if (previousSessionExercise.setOrder.length < this.MAX_SETS_PER_EXERCISE &&
|
|
180
|
-
!sessionIsCapped(
|
|
180
|
+
!sessionIsCapped(cto._id)) {
|
|
181
181
|
candidates.push({
|
|
182
|
-
exerciseId:
|
|
182
|
+
exerciseId: cto._id,
|
|
183
183
|
// Don't error if SFR is null for now, just treat as very low
|
|
184
184
|
sfr: WorkoutSessionExerciseService.getSFR(previousSessionExercise) ??
|
|
185
185
|
Number.NEGATIVE_INFINITY,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkoutVolumePlanningService.js","sourceRoot":"","sources":["../../../../../src/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.ts"],"names":[],"mappings":"AAIA,OAAO,6BAA6B,MAAM,wDAAwD,CAAC;AAEnG;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA4B;IACvC,MAAM,CAAU,qBAAqB,GAAG,CAAC,CAAC;IAC1C,MAAM,CAAU,qCAAqC,GAAG,EAAE,CAAC;IAEnE;;OAEG;IACH,MAAM,CAAC,6BAA6B,CAClC,OAAoC,EACpC,eAAuB,EACvB,kBAA2B;QAE3B,IAAI,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"WorkoutVolumePlanningService.js","sourceRoot":"","sources":["../../../../../src/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { UUID } from 'crypto';
|
|
2
|
-
import type {
|
|
2
|
+
import type { WorkoutExerciseCTO } from '../../../../ctos/workout/WorkoutExerciseCTO.js';
|
|
3
3
|
import type { WorkoutSessionExercise } from '../../../../documents/workout/WorkoutSessionExercise.js';
|
|
4
4
|
import type WorkoutMesocyclePlanContext from '../../Mesocycle/WorkoutMesocyclePlanContext.js';
|
|
5
5
|
import WorkoutSessionExerciseService from '../../SessionExercise/WorkoutSessionExerciseService.js';
|
|
@@ -32,20 +32,20 @@ export default class WorkoutVolumePlanningService {
|
|
|
32
32
|
microcycleIndex: number,
|
|
33
33
|
isDeloadMicrocycle: boolean
|
|
34
34
|
): { exerciseIdToSetCount: Map<UUID, number>; recoveryExerciseIds: Set<UUID> } {
|
|
35
|
-
if (!context.
|
|
35
|
+
if (!context.muscleGroupToExerciseCTOsMap) {
|
|
36
36
|
throw new Error(
|
|
37
|
-
'WorkoutMesocyclePlanContext.
|
|
37
|
+
'WorkoutMesocyclePlanContext.muscleGroupToExerciseCTOsMap is not initialized. This should be set during mesocycle planning.'
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
const exerciseIdToSetCount = new Map<UUID, number>();
|
|
42
42
|
const recoveryExerciseIds = new Set<UUID>();
|
|
43
43
|
|
|
44
|
-
context.
|
|
44
|
+
context.muscleGroupToExerciseCTOsMap.values().forEach((muscleGroupExerciseCTOs) => {
|
|
45
45
|
const result = this.calculateSetCountForEachExerciseInMuscleGroup(
|
|
46
46
|
context,
|
|
47
47
|
microcycleIndex,
|
|
48
|
-
|
|
48
|
+
muscleGroupExerciseCTOs,
|
|
49
49
|
isDeloadMicrocycle
|
|
50
50
|
);
|
|
51
51
|
for (const [workoutExerciseId, setCount] of result.exerciseIdToSetCount) {
|
|
@@ -68,7 +68,7 @@ export default class WorkoutVolumePlanningService {
|
|
|
68
68
|
private static calculateSetCountForEachExerciseInMuscleGroup(
|
|
69
69
|
context: WorkoutMesocyclePlanContext,
|
|
70
70
|
microcycleIndex: number,
|
|
71
|
-
|
|
71
|
+
muscleGroupExerciseCTOs: WorkoutExerciseCTO[],
|
|
72
72
|
isDeloadMicrocycle: boolean
|
|
73
73
|
): { exerciseIdToSetCount: Map<UUID, number>; recoveryExerciseIds: Set<UUID> } {
|
|
74
74
|
const exerciseIdToSetCount = new Map<UUID, number>();
|
|
@@ -76,23 +76,23 @@ export default class WorkoutVolumePlanningService {
|
|
|
76
76
|
const sessionIndexToExerciseIds = new Map<number, UUID[]>();
|
|
77
77
|
|
|
78
78
|
// 1. Calculate baselines for all exercises in muscle group
|
|
79
|
-
|
|
79
|
+
muscleGroupExerciseCTOs.forEach((cto, index) => {
|
|
80
80
|
const baseline = this.calculateBaselineSetCount(
|
|
81
81
|
microcycleIndex,
|
|
82
|
-
|
|
82
|
+
muscleGroupExerciseCTOs.length,
|
|
83
83
|
index,
|
|
84
84
|
isDeloadMicrocycle
|
|
85
85
|
);
|
|
86
|
-
exerciseIdToSetCount.set(
|
|
86
|
+
exerciseIdToSetCount.set(cto._id, Math.min(baseline, this.MAX_SETS_PER_EXERCISE));
|
|
87
87
|
|
|
88
88
|
// Build out the map for session indices to the array of exercise IDs as it pertains to this
|
|
89
89
|
// muscle group.
|
|
90
90
|
if (!context.exerciseIdToSessionIndex) return;
|
|
91
|
-
const exerciseSessionIndex = context.exerciseIdToSessionIndex.get(
|
|
91
|
+
const exerciseSessionIndex = context.exerciseIdToSessionIndex.get(cto._id);
|
|
92
92
|
if (exerciseSessionIndex === undefined) return;
|
|
93
93
|
const existingExerciseIdsForSession =
|
|
94
94
|
sessionIndexToExerciseIds.get(exerciseSessionIndex) || [];
|
|
95
|
-
existingExerciseIdsForSession.push(
|
|
95
|
+
existingExerciseIdsForSession.push(cto._id);
|
|
96
96
|
sessionIndexToExerciseIds.set(exerciseSessionIndex, existingExerciseIdsForSession);
|
|
97
97
|
});
|
|
98
98
|
|
|
@@ -103,7 +103,7 @@ export default class WorkoutVolumePlanningService {
|
|
|
103
103
|
if (!previousMicrocycle) return { exerciseIdToSetCount, recoveryExerciseIds };
|
|
104
104
|
|
|
105
105
|
// Map previous session exercises
|
|
106
|
-
const exerciseIds = new Set(
|
|
106
|
+
const exerciseIds = new Set(muscleGroupExerciseCTOs.map((cto) => cto._id));
|
|
107
107
|
const exerciseIdToPrevSessionExercise = new Map<UUID, WorkoutSessionExercise>();
|
|
108
108
|
const foundExerciseIds = new Set<UUID>();
|
|
109
109
|
const exercisesThatWerePreviouslyInRecovery = new Set<UUID>();
|
|
@@ -150,8 +150,8 @@ export default class WorkoutVolumePlanningService {
|
|
|
150
150
|
// For deload microcycles, halve the historical count (minimum 1 set). We don't use baseline
|
|
151
151
|
// because the user may have adjusted over the mesocycle in a way that the baseline is actually
|
|
152
152
|
// a higher set count than what would be calculated by halving the previous microcycle's sets.
|
|
153
|
-
|
|
154
|
-
const previousSessionExercise = exerciseIdToPrevSessionExercise.get(
|
|
153
|
+
muscleGroupExerciseCTOs.forEach((cto) => {
|
|
154
|
+
const previousSessionExercise = exerciseIdToPrevSessionExercise.get(cto._id);
|
|
155
155
|
if (previousSessionExercise) {
|
|
156
156
|
let setCount = Math.min(
|
|
157
157
|
previousSessionExercise.setOrder.length,
|
|
@@ -160,7 +160,7 @@ export default class WorkoutVolumePlanningService {
|
|
|
160
160
|
if (isDeloadMicrocycle) {
|
|
161
161
|
setCount = Math.max(1, Math.floor(setCount / 2));
|
|
162
162
|
}
|
|
163
|
-
exerciseIdToSetCount.set(
|
|
163
|
+
exerciseIdToSetCount.set(cto._id, setCount);
|
|
164
164
|
}
|
|
165
165
|
});
|
|
166
166
|
|
|
@@ -201,12 +201,12 @@ export default class WorkoutVolumePlanningService {
|
|
|
201
201
|
muscleGroupIndex: number;
|
|
202
202
|
previousSetCount: number;
|
|
203
203
|
}[] = [];
|
|
204
|
-
|
|
205
|
-
const previousSessionExercise = exerciseIdToPrevSessionExercise.get(
|
|
204
|
+
muscleGroupExerciseCTOs.forEach((cto, muscleGroupIndex) => {
|
|
205
|
+
const previousSessionExercise = exerciseIdToPrevSessionExercise.get(cto._id);
|
|
206
206
|
if (!previousSessionExercise) return;
|
|
207
207
|
|
|
208
208
|
let recommendation: number | null;
|
|
209
|
-
if (!exercisesThatWerePreviouslyInRecovery.has(
|
|
209
|
+
if (!exercisesThatWerePreviouslyInRecovery.has(cto._id)) {
|
|
210
210
|
recommendation =
|
|
211
211
|
WorkoutSessionExerciseService.getRecommendedSetAdditionsOrRecovery(
|
|
212
212
|
previousSessionExercise
|
|
@@ -220,21 +220,21 @@ export default class WorkoutVolumePlanningService {
|
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
if (recommendation === -1) {
|
|
223
|
-
recoveryExerciseIds.add(
|
|
223
|
+
recoveryExerciseIds.add(cto._id);
|
|
224
224
|
// Cut sets in half (rounded down, minimum 1) for recovery
|
|
225
225
|
const previousSetCount = previousSessionExercise.setOrder.length;
|
|
226
226
|
const recoverySets = Math.max(1, Math.floor(previousSetCount / 2));
|
|
227
|
-
exerciseIdToSetCount.set(
|
|
227
|
+
exerciseIdToSetCount.set(cto._id, recoverySets);
|
|
228
228
|
} else if (recommendation != null && recommendation >= 0) {
|
|
229
229
|
totalSetsToAdd += recommendation;
|
|
230
230
|
|
|
231
231
|
// Consider as candidate if session is not already capped
|
|
232
232
|
if (
|
|
233
233
|
previousSessionExercise.setOrder.length < this.MAX_SETS_PER_EXERCISE &&
|
|
234
|
-
!sessionIsCapped(
|
|
234
|
+
!sessionIsCapped(cto._id)
|
|
235
235
|
) {
|
|
236
236
|
candidates.push({
|
|
237
|
-
exerciseId:
|
|
237
|
+
exerciseId: cto._id,
|
|
238
238
|
// Don't error if SFR is null for now, just treat as very low
|
|
239
239
|
sfr:
|
|
240
240
|
WorkoutSessionExerciseService.getSFR(previousSessionExercise) ??
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@aneuhold/core-ts-db-lib",
|
|
3
3
|
"author": "Anton G. Neuhold Jr.",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "4.1.
|
|
5
|
+
"version": "4.1.12",
|
|
6
6
|
"description": "A core database library used for personal projects",
|
|
7
7
|
"packageManager": "pnpm@10.25.0",
|
|
8
8
|
"type": "module",
|
|
@@ -72,12 +72,12 @@
|
|
|
72
72
|
"Node.js"
|
|
73
73
|
],
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@aneuhold/core-ts-lib": "^2.4.
|
|
75
|
+
"@aneuhold/core-ts-lib": "^2.4.1",
|
|
76
76
|
"uuid": "^13.0.0",
|
|
77
77
|
"zod": "^4.1.13"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
|
-
"@aneuhold/local-npm-registry": "^0.2.
|
|
80
|
+
"@aneuhold/local-npm-registry": "^0.2.28",
|
|
81
81
|
"@aneuhold/main-scripts": "^2.8.3",
|
|
82
82
|
"@types/node": "^25.0.2",
|
|
83
83
|
"eslint": "^9.39.2",
|