hevy-shared 1.0.646 → 1.0.647
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/built/index.d.ts +12 -3
- package/built/index.js +35 -14
- package/built/muscleSplits.d.ts +29 -2
- package/built/muscleSplits.js +86 -51
- package/built/notifications.d.ts +3 -9
- package/built/tests/muscleSplit.test.d.ts +1 -0
- package/built/tests/muscleSplit.test.js +153 -0
- package/package.json +1 -1
package/built/index.d.ts
CHANGED
|
@@ -444,7 +444,6 @@ export interface UserHevyProSubcription {
|
|
|
444
444
|
managing_store: UserHevyProSubcriptionStore;
|
|
445
445
|
type: 'monthly' | 'yearly' | 'lifetime' | 'custom';
|
|
446
446
|
expires_date?: string;
|
|
447
|
-
grace_period_expires_date?: string | null;
|
|
448
447
|
/**
|
|
449
448
|
* Set if the user has paused/cancelled their subscription
|
|
450
449
|
*/
|
|
@@ -550,10 +549,20 @@ export interface PublicUserProfile {
|
|
|
550
549
|
weekly_workout_durations: WeeklyWorkoutDuration[];
|
|
551
550
|
last_workout?: Workout;
|
|
552
551
|
}
|
|
553
|
-
export declare const
|
|
552
|
+
export declare const coreMuscles: readonly ["abdominals"];
|
|
553
|
+
export declare const shoulderMuscles: readonly ["shoulders"];
|
|
554
|
+
export declare const armMuscles: readonly ["biceps", "triceps", "forearms"];
|
|
555
|
+
export declare const legMuscles: readonly ["quadriceps", "hamstrings", "calves", "glutes", "abductors", "adductors"];
|
|
556
|
+
export declare const backMuscles: readonly ["lats", "traps", "lower_back", "upper_back"];
|
|
557
|
+
export declare const chestMuscles: readonly ["chest"];
|
|
558
|
+
export declare const miscellaneousMuscles: readonly ["cardio", "neck", "full_body", "other"];
|
|
559
|
+
export declare const simplifiedMuscleGroups: readonly ["core", "shoulders", "arms", "legs", "back", "chest"];
|
|
560
|
+
export type SimplifiedMuscleGroup = Lookup<typeof simplifiedMuscleGroups>;
|
|
561
|
+
export declare const isSimplifiedMuscleGroup: (x: string) => x is SimplifiedMuscleGroup;
|
|
562
|
+
export declare const muscleGroups: readonly ["abdominals", "shoulders", "biceps", "triceps", "forearms", "quadriceps", "hamstrings", "calves", "glutes", "abductors", "adductors", "lats", "traps", "lower_back", "upper_back", "chest", "cardio", "neck", "full_body", "other"];
|
|
554
563
|
export type MuscleGroup = Lookup<typeof muscleGroups>;
|
|
555
564
|
export declare const isMuscleGroup: (x: string) => x is MuscleGroup;
|
|
556
|
-
export declare const muscleGroupFilters: readonly ["all_muscles", "abdominals", "
|
|
565
|
+
export declare const muscleGroupFilters: readonly ["all_muscles", "abdominals", "shoulders", "biceps", "triceps", "forearms", "quadriceps", "hamstrings", "calves", "glutes", "abductors", "adductors", "lats", "traps", "lower_back", "upper_back", "chest", "cardio", "neck", "full_body", "other"];
|
|
557
566
|
export type MuscleGroupFilter = Lookup<typeof muscleGroupFilters>;
|
|
558
567
|
export declare const isMuscleGroupFilter: (x: string) => x is MuscleGroupFilter;
|
|
559
568
|
/**
|
package/built/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.isValidUserWorkoutMetricsType = exports.isBodyMeasurementKey = exports.measurementsList = exports.isWorkoutBiometrics = exports.isHeartRateSamples = exports.isPublicWorkout = exports.isSetType = exports.isRPE = exports.validRpeValues = exports.isSetPersonalRecordType = exports.supportedInstructionsLanguages = exports.exerciseCategories = exports.trainingLevels = exports.trainingGoals = exports.isCustomExerciseType = exports.customExericseTypes = exports.isExerciseType = exports.exerciseTypes = exports.isExerciseRepType = exports.exerciseRepTypes = exports.isEquipmentFilter = exports.equipmentFilters = exports.isEquipment = exports.equipments = exports.isMuscleGroupFilter = exports.muscleGroupFilters = exports.isMuscleGroup = exports.muscleGroups = exports.DefaultClientConfiguration = exports.isCoachRole = exports.isErrorResponse = exports.isLivePRVolumeOption = exports.isTimerVolumeOption = exports.isWeekday = exports.orderedWeekdays = exports.isBodyMeasurementUnit = exports.isDistanceUnitShort = exports.isDistanceUnit = exports.isWeightUnit = exports.isLanguage = exports.supportedLanguages = void 0;
|
|
17
|
+
exports.isValidUserWorkoutMetricsType = exports.isBodyMeasurementKey = exports.measurementsList = exports.isWorkoutBiometrics = exports.isHeartRateSamples = exports.isPublicWorkout = exports.isSetType = exports.isRPE = exports.validRpeValues = exports.isSetPersonalRecordType = exports.supportedInstructionsLanguages = exports.exerciseCategories = exports.trainingLevels = exports.trainingGoals = exports.isCustomExerciseType = exports.customExericseTypes = exports.isExerciseType = exports.exerciseTypes = exports.isExerciseRepType = exports.exerciseRepTypes = exports.isEquipmentFilter = exports.equipmentFilters = exports.isEquipment = exports.equipments = exports.isMuscleGroupFilter = exports.muscleGroupFilters = exports.isMuscleGroup = exports.muscleGroups = exports.isSimplifiedMuscleGroup = exports.simplifiedMuscleGroups = exports.miscellaneousMuscles = exports.chestMuscles = exports.backMuscles = exports.legMuscles = exports.armMuscles = exports.shoulderMuscles = exports.coreMuscles = exports.DefaultClientConfiguration = exports.isCoachRole = exports.isErrorResponse = exports.isLivePRVolumeOption = exports.isTimerVolumeOption = exports.isWeekday = exports.orderedWeekdays = exports.isBodyMeasurementUnit = exports.isDistanceUnitShort = exports.isDistanceUnit = exports.isWeightUnit = exports.isLanguage = exports.supportedLanguages = void 0;
|
|
18
18
|
const typeUtils_1 = require("./typeUtils");
|
|
19
19
|
__exportStar(require("./constants"), exports);
|
|
20
20
|
__exportStar(require("./utils"), exports);
|
|
@@ -104,28 +104,49 @@ const _supportedProStores = [
|
|
|
104
104
|
'paddle',
|
|
105
105
|
'hevy-coach',
|
|
106
106
|
];
|
|
107
|
-
exports.
|
|
108
|
-
|
|
107
|
+
exports.coreMuscles = ['abdominals'];
|
|
108
|
+
exports.shoulderMuscles = ['shoulders'];
|
|
109
|
+
exports.armMuscles = ['biceps', 'triceps', 'forearms'];
|
|
110
|
+
exports.legMuscles = [
|
|
111
|
+
'quadriceps',
|
|
112
|
+
'hamstrings',
|
|
113
|
+
'calves',
|
|
114
|
+
'glutes',
|
|
109
115
|
'abductors',
|
|
110
116
|
'adductors',
|
|
111
|
-
|
|
117
|
+
];
|
|
118
|
+
exports.backMuscles = [
|
|
119
|
+
'lats',
|
|
120
|
+
'traps',
|
|
112
121
|
'lower_back',
|
|
113
122
|
'upper_back',
|
|
123
|
+
];
|
|
124
|
+
exports.chestMuscles = ['chest'];
|
|
125
|
+
exports.miscellaneousMuscles = [
|
|
114
126
|
'cardio',
|
|
115
|
-
'chest',
|
|
116
|
-
'calves',
|
|
117
|
-
'forearms',
|
|
118
|
-
'glutes',
|
|
119
|
-
'hamstrings',
|
|
120
|
-
'lats',
|
|
121
|
-
'quadriceps',
|
|
122
|
-
'shoulders',
|
|
123
|
-
'triceps',
|
|
124
|
-
'traps',
|
|
125
127
|
'neck',
|
|
126
128
|
'full_body',
|
|
127
129
|
'other',
|
|
128
130
|
];
|
|
131
|
+
exports.simplifiedMuscleGroups = [
|
|
132
|
+
'core',
|
|
133
|
+
'shoulders',
|
|
134
|
+
'arms',
|
|
135
|
+
'legs',
|
|
136
|
+
'back',
|
|
137
|
+
'chest',
|
|
138
|
+
];
|
|
139
|
+
const isSimplifiedMuscleGroup = (x) => (0, typeUtils_1.isInArray)(x, exports.simplifiedMuscleGroups);
|
|
140
|
+
exports.isSimplifiedMuscleGroup = isSimplifiedMuscleGroup;
|
|
141
|
+
exports.muscleGroups = [
|
|
142
|
+
...exports.coreMuscles,
|
|
143
|
+
...exports.shoulderMuscles,
|
|
144
|
+
...exports.armMuscles,
|
|
145
|
+
...exports.legMuscles,
|
|
146
|
+
...exports.backMuscles,
|
|
147
|
+
...exports.chestMuscles,
|
|
148
|
+
...exports.miscellaneousMuscles,
|
|
149
|
+
];
|
|
129
150
|
const isMuscleGroup = (x) => (0, typeUtils_1.isInArray)(x, exports.muscleGroups);
|
|
130
151
|
exports.isMuscleGroup = isMuscleGroup;
|
|
131
152
|
exports.muscleGroupFilters = ['all_muscles', ...exports.muscleGroups];
|
package/built/muscleSplits.d.ts
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { MuscleGroup, SetType, SimplifiedMuscleGroup } from '.';
|
|
2
|
+
interface SetCountableSet {
|
|
3
|
+
indicator: SetType;
|
|
4
|
+
}
|
|
5
|
+
interface SetCountableExercise {
|
|
6
|
+
muscle_group: MuscleGroup;
|
|
7
|
+
other_muscles: MuscleGroup[];
|
|
8
|
+
sets: SetCountableSet[];
|
|
9
|
+
}
|
|
10
|
+
export interface SetCountableWorkoutOrRoutine {
|
|
11
|
+
exercises: SetCountableExercise[];
|
|
12
|
+
}
|
|
13
|
+
export declare const calculateSetContributionsForSimplifiedMuscleGroups: ({ muscle_group, other_muscles, }: {
|
|
14
|
+
muscle_group: MuscleGroup;
|
|
15
|
+
other_muscles: MuscleGroup[];
|
|
16
|
+
}) => {
|
|
3
17
|
core: number;
|
|
4
18
|
shoulders: number;
|
|
5
19
|
arms: number;
|
|
@@ -7,3 +21,16 @@ export declare const calculateMuscleSplit: (workoutsOrRoutines: Workout[] | Base
|
|
|
7
21
|
back: number;
|
|
8
22
|
chest: number;
|
|
9
23
|
};
|
|
24
|
+
export declare const calculateSimplifiedMuscleSplit: ({ workoutsOrRoutines, includeWarmupSets, }: {
|
|
25
|
+
workoutsOrRoutines: SetCountableWorkoutOrRoutine[];
|
|
26
|
+
includeWarmupSets: boolean;
|
|
27
|
+
}) => Record<SimplifiedMuscleGroup, number>;
|
|
28
|
+
export declare const calculateSetContributionsForMuscleGroups: ({ muscleGroup, otherMuscles, }: {
|
|
29
|
+
muscleGroup: MuscleGroup;
|
|
30
|
+
otherMuscles: MuscleGroup[];
|
|
31
|
+
}) => Record<MuscleGroup, number>;
|
|
32
|
+
export declare const calculateSetCountPerMuscleGroups: ({ workoutsOrRoutines, includeWarmupSets, }: {
|
|
33
|
+
workoutsOrRoutines: SetCountableWorkoutOrRoutine[];
|
|
34
|
+
includeWarmupSets: boolean;
|
|
35
|
+
}) => Record<MuscleGroup, number>;
|
|
36
|
+
export {};
|
package/built/muscleSplits.js
CHANGED
|
@@ -3,63 +3,98 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.calculateSetCountPerMuscleGroups = exports.calculateSetContributionsForMuscleGroups = exports.calculateSimplifiedMuscleSplit = exports.calculateSetContributionsForSimplifiedMuscleGroups = void 0;
|
|
7
7
|
const intersection_1 = __importDefault(require("lodash/intersection"));
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
'quadriceps',
|
|
14
|
-
'hamstrings',
|
|
15
|
-
'glutes',
|
|
16
|
-
'calves',
|
|
17
|
-
'abductors',
|
|
18
|
-
'adductors',
|
|
19
|
-
];
|
|
20
|
-
const backMuscles = [
|
|
21
|
-
'lower_back',
|
|
22
|
-
'upper_back',
|
|
23
|
-
'lats',
|
|
24
|
-
'traps',
|
|
25
|
-
];
|
|
26
|
-
const chestMuscles = ['chest'];
|
|
27
|
-
let core = 0;
|
|
28
|
-
let shoulders = 0;
|
|
29
|
-
let arms = 0;
|
|
30
|
-
let legs = 0;
|
|
31
|
-
let back = 0;
|
|
32
|
-
let chest = 0;
|
|
33
|
-
const muscleGroupValueIncrement = (e, mg) => {
|
|
34
|
-
let increment = 0;
|
|
35
|
-
if (mg.includes(e.muscle_group)) {
|
|
36
|
-
increment += e.sets.length;
|
|
8
|
+
const _1 = require(".");
|
|
9
|
+
const calculateSetContributionsForSimplifiedMuscleGroups = ({ muscle_group, other_muscles, }) => {
|
|
10
|
+
const getContribution = (mg) => {
|
|
11
|
+
if (mg.includes(muscle_group)) {
|
|
12
|
+
return 1;
|
|
37
13
|
}
|
|
38
|
-
else if ((0, intersection_1.default)(mg,
|
|
39
|
-
|
|
14
|
+
else if ((0, intersection_1.default)(mg, other_muscles).length) {
|
|
15
|
+
return 0.5;
|
|
40
16
|
}
|
|
41
|
-
else if (
|
|
42
|
-
|
|
17
|
+
else if (muscle_group === 'full_body') {
|
|
18
|
+
return 1 / 6;
|
|
43
19
|
}
|
|
44
|
-
return
|
|
20
|
+
return 0;
|
|
45
21
|
};
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
22
|
+
return {
|
|
23
|
+
core: getContribution(_1.coreMuscles),
|
|
24
|
+
shoulders: getContribution(_1.shoulderMuscles),
|
|
25
|
+
arms: getContribution(_1.armMuscles),
|
|
26
|
+
legs: getContribution(_1.legMuscles),
|
|
27
|
+
back: getContribution(_1.backMuscles),
|
|
28
|
+
chest: getContribution(_1.chestMuscles),
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
exports.calculateSetContributionsForSimplifiedMuscleGroups = calculateSetContributionsForSimplifiedMuscleGroups;
|
|
32
|
+
const calculateSimplifiedMuscleSplit = ({ workoutsOrRoutines, includeWarmupSets, }) => {
|
|
33
|
+
const totals = {
|
|
34
|
+
core: 0,
|
|
35
|
+
shoulders: 0,
|
|
36
|
+
arms: 0,
|
|
37
|
+
legs: 0,
|
|
38
|
+
back: 0,
|
|
39
|
+
chest: 0,
|
|
40
|
+
};
|
|
41
|
+
for (const workoutOrRoutine of workoutsOrRoutines) {
|
|
42
|
+
for (const exercise of workoutOrRoutine.exercises) {
|
|
43
|
+
const trimmedSets = includeWarmupSets
|
|
44
|
+
? exercise.sets
|
|
45
|
+
: exercise.sets.filter((s) => s.indicator !== 'warmup');
|
|
46
|
+
const setCount = trimmedSets.length;
|
|
47
|
+
const contributions = (0, exports.calculateSetContributionsForSimplifiedMuscleGroups)({
|
|
48
|
+
muscle_group: exercise.muscle_group,
|
|
49
|
+
other_muscles: exercise.other_muscles,
|
|
50
|
+
});
|
|
51
|
+
totals.core += contributions.core * setCount;
|
|
52
|
+
totals.shoulders += contributions.shoulders * setCount;
|
|
53
|
+
totals.arms += contributions.arms * setCount;
|
|
54
|
+
totals.legs += contributions.legs * setCount;
|
|
55
|
+
totals.back += contributions.back * setCount;
|
|
56
|
+
totals.chest += contributions.chest * setCount;
|
|
54
57
|
}
|
|
55
58
|
}
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
return totals;
|
|
60
|
+
};
|
|
61
|
+
exports.calculateSimplifiedMuscleSplit = calculateSimplifiedMuscleSplit;
|
|
62
|
+
const calculateSetContributionsForMuscleGroups = ({ muscleGroup, otherMuscles, }) => {
|
|
63
|
+
const getContribution = (mg) => {
|
|
64
|
+
if (mg === muscleGroup) {
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
else if (otherMuscles.includes(mg)) {
|
|
68
|
+
return 0.5;
|
|
69
|
+
}
|
|
70
|
+
return 0;
|
|
63
71
|
};
|
|
72
|
+
return _1.muscleGroups.reduce((acc, mg) => {
|
|
73
|
+
acc[mg] = getContribution(mg);
|
|
74
|
+
return acc;
|
|
75
|
+
}, {});
|
|
76
|
+
};
|
|
77
|
+
exports.calculateSetContributionsForMuscleGroups = calculateSetContributionsForMuscleGroups;
|
|
78
|
+
const calculateSetCountPerMuscleGroups = ({ workoutsOrRoutines, includeWarmupSets, }) => {
|
|
79
|
+
const totals = _1.muscleGroups.reduce((acc, muscleGroup) => {
|
|
80
|
+
acc[muscleGroup] = 0;
|
|
81
|
+
return acc;
|
|
82
|
+
}, {});
|
|
83
|
+
for (const workoutOrRoutine of workoutsOrRoutines) {
|
|
84
|
+
for (const exercise of workoutOrRoutine.exercises) {
|
|
85
|
+
const trimmedSets = includeWarmupSets
|
|
86
|
+
? exercise.sets
|
|
87
|
+
: exercise.sets.filter((s) => s.indicator !== 'warmup');
|
|
88
|
+
const setCount = trimmedSets.length;
|
|
89
|
+
const contributions = (0, exports.calculateSetContributionsForMuscleGroups)({
|
|
90
|
+
muscleGroup: exercise.muscle_group,
|
|
91
|
+
otherMuscles: exercise.other_muscles,
|
|
92
|
+
});
|
|
93
|
+
for (const muscleGroup of _1.muscleGroups) {
|
|
94
|
+
totals[muscleGroup] += contributions[muscleGroup] * setCount;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return totals;
|
|
64
99
|
};
|
|
65
|
-
exports.
|
|
100
|
+
exports.calculateSetCountPerMuscleGroups = calculateSetCountPerMuscleGroups;
|
package/built/notifications.d.ts
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { ClientsCoachData, Program } from '.';
|
|
9
9
|
import { HevyChatUpdateMobilePushData } from './chat';
|
|
10
|
-
export type Notification = WorkoutCompleteNotification | WorkoutMentionNotification | WorkoutCommentNotification | WorkoutCommentMentionNotification | WorkoutCommentReplyNotification | WorkoutCommentDiscussionNotification | WorkoutLikeNotification | WorkoutCommentLikeNotification | FollowNotification | FollowRequestNotification | AcceptFollowRequestNotification |
|
|
11
|
-
export type NotificationType = 'workout-complete' | 'workout-mention' | 'workout-comment' | 'workout-comment-mention' | 'workout-comment-reply' | 'workout-comment-reply-v2' | 'workout-like' | 'workout-comment-like' | 'follow' | 'follow-request' | 'accept-follow-request' | '
|
|
10
|
+
export type Notification = WorkoutCompleteNotification | WorkoutMentionNotification | WorkoutCommentNotification | WorkoutCommentMentionNotification | WorkoutCommentReplyNotification | WorkoutCommentDiscussionNotification | WorkoutLikeNotification | WorkoutCommentLikeNotification | FollowNotification | FollowRequestNotification | AcceptFollowRequestNotification | CoachClientInviteNotification | ContactOnHevyNotification;
|
|
11
|
+
export type NotificationType = 'workout-complete' | 'workout-mention' | 'workout-comment' | 'workout-comment-mention' | 'workout-comment-reply' | 'workout-comment-reply-v2' | 'workout-like' | 'workout-comment-like' | 'follow' | 'follow-request' | 'accept-follow-request' | 'coach-client-invite' | 'contact-on-hevy';
|
|
12
12
|
export interface BaseNotification {
|
|
13
13
|
id: number;
|
|
14
14
|
type: NotificationType;
|
|
@@ -111,12 +111,6 @@ export interface AcceptFollowRequestNotification extends BaseNotification {
|
|
|
111
111
|
export interface AcceptFollowRequestMobilePushData extends BaseMobilePushData {
|
|
112
112
|
type: 'accept-follow-request';
|
|
113
113
|
}
|
|
114
|
-
export interface GracePeriodStatusMobilePushData extends BaseMobilePushData {
|
|
115
|
-
type: 'grace-period-status';
|
|
116
|
-
}
|
|
117
|
-
export interface GracePeriodStatusNotification extends BaseNotification {
|
|
118
|
-
type: 'grace-period-status';
|
|
119
|
-
}
|
|
120
114
|
export interface CoachClientInviteNotification extends BaseNotification {
|
|
121
115
|
type: 'coach-client-invite';
|
|
122
116
|
from_full_name?: string;
|
|
@@ -201,4 +195,4 @@ export interface MonthlyReportMobilePushData extends BaseMobilePushData {
|
|
|
201
195
|
type: 'monthly-report';
|
|
202
196
|
deeplink: string;
|
|
203
197
|
}
|
|
204
|
-
export type MobilePushData = ChatUpdateMobilePushData | SyncCustomExercisesAndCoachCustomizationsMobilePushData | SyncWorkoutsMobilePushData | SyncRoutineFoldersMobilePushData | SyncRoutinesMobilePushData | ProStatusChangedPushMobilePushData | HevyProSubscriptionRenewedMobilePushData | CoachProgramChangedMobilePushData | CoachDataChangedMobilePushData | ContactOnHevyMobilePushData | CoachClientInviteMobilePushData | AcceptFollowRequestMobilePushData | FollowRequestMobilePushData | FollowMobilePushData | WorkoutLikeMobilePushData | WorkoutCommentLikeMobilePushData | WorkoutCommentMentionMobilePushData | WorkoutCommentDiscussionMobilePushData | WorkoutCommentReplyMobilePushData | WorkoutCommentMobilePushData | WorkoutMentionMobilePushData | WorkoutCompleteMobilePushData |
|
|
198
|
+
export type MobilePushData = ChatUpdateMobilePushData | SyncCustomExercisesAndCoachCustomizationsMobilePushData | SyncWorkoutsMobilePushData | SyncRoutineFoldersMobilePushData | SyncRoutinesMobilePushData | ProStatusChangedPushMobilePushData | HevyProSubscriptionRenewedMobilePushData | CoachProgramChangedMobilePushData | CoachDataChangedMobilePushData | ContactOnHevyMobilePushData | CoachClientInviteMobilePushData | AcceptFollowRequestMobilePushData | FollowRequestMobilePushData | FollowMobilePushData | WorkoutLikeMobilePushData | WorkoutCommentLikeMobilePushData | WorkoutCommentMentionMobilePushData | WorkoutCommentDiscussionMobilePushData | WorkoutCommentReplyMobilePushData | WorkoutCommentMobilePushData | WorkoutMentionMobilePushData | WorkoutCompleteMobilePushData | CoachProgramFinishesNextWeekMobilePushData | CoachProgramStartsTodayMobilePushData | CoachLoggedYourWorkoutMobilePushData | CoachLoggedYourMeasurementsMobilePushData | MonthlyReportMobilePushData;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const muscleSplits_1 = require("../muscleSplits");
|
|
4
|
+
class SetCountableWorkoutOrRoutineBuilder {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.exercises = [];
|
|
7
|
+
}
|
|
8
|
+
addExercise(muscle_group, other_muscles, sets) {
|
|
9
|
+
this.exercises.push({
|
|
10
|
+
muscle_group,
|
|
11
|
+
other_muscles,
|
|
12
|
+
sets: sets.map((indicator) => ({ indicator })),
|
|
13
|
+
});
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
build() {
|
|
17
|
+
return {
|
|
18
|
+
exercises: this.exercises,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
describe('muscleSplits', () => {
|
|
23
|
+
describe('calculateSetContributionsForSimplifiedMuscleGroups', () => {
|
|
24
|
+
it('should return 1 for the main muscle group', () => {
|
|
25
|
+
const contributions = (0, muscleSplits_1.calculateSetContributionsForSimplifiedMuscleGroups)({
|
|
26
|
+
muscle_group: 'chest',
|
|
27
|
+
other_muscles: [],
|
|
28
|
+
});
|
|
29
|
+
expect(contributions.chest).toBe(1);
|
|
30
|
+
expect(contributions.back).toBe(0);
|
|
31
|
+
expect(contributions.shoulders).toBe(0);
|
|
32
|
+
expect(contributions.arms).toBe(0);
|
|
33
|
+
expect(contributions.legs).toBe(0);
|
|
34
|
+
expect(contributions.core).toBe(0);
|
|
35
|
+
});
|
|
36
|
+
it('should return 0.5 for other muscle groups', () => {
|
|
37
|
+
const contributions = (0, muscleSplits_1.calculateSetContributionsForSimplifiedMuscleGroups)({
|
|
38
|
+
muscle_group: 'shoulders',
|
|
39
|
+
other_muscles: ['triceps'],
|
|
40
|
+
});
|
|
41
|
+
expect(contributions.shoulders).toBe(1);
|
|
42
|
+
expect(contributions.arms).toBe(0.5);
|
|
43
|
+
});
|
|
44
|
+
it('should return 1/6 for full body exercises', () => {
|
|
45
|
+
const contributions = (0, muscleSplits_1.calculateSetContributionsForSimplifiedMuscleGroups)({
|
|
46
|
+
muscle_group: 'full_body',
|
|
47
|
+
other_muscles: [],
|
|
48
|
+
});
|
|
49
|
+
const expected = 1 / 6;
|
|
50
|
+
expect(contributions.chest).toBe(expected);
|
|
51
|
+
expect(contributions.back).toBe(expected);
|
|
52
|
+
expect(contributions.shoulders).toBe(expected);
|
|
53
|
+
expect(contributions.arms).toBe(expected);
|
|
54
|
+
expect(contributions.legs).toBe(expected);
|
|
55
|
+
expect(contributions.core).toBe(expected);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('calculateSimplifiedMuscleSplit', () => {
|
|
59
|
+
it('should calculate the split correctly', () => {
|
|
60
|
+
const workout = new SetCountableWorkoutOrRoutineBuilder()
|
|
61
|
+
.addExercise('chest', ['triceps'], ['normal', 'normal', 'normal'])
|
|
62
|
+
.addExercise('lats', ['biceps'], ['normal', 'normal'])
|
|
63
|
+
.build();
|
|
64
|
+
const split = (0, muscleSplits_1.calculateSimplifiedMuscleSplit)({
|
|
65
|
+
workoutsOrRoutines: [workout],
|
|
66
|
+
includeWarmupSets: false,
|
|
67
|
+
});
|
|
68
|
+
expect(split.chest).toBe(3);
|
|
69
|
+
expect(split.arms).toBe(3 * 0.5 + 2 * 0.5); // 1.5 from chest day, 1 from back day
|
|
70
|
+
expect(split.back).toBe(2);
|
|
71
|
+
});
|
|
72
|
+
it('should handle warmup sets', () => {
|
|
73
|
+
const workout = new SetCountableWorkoutOrRoutineBuilder()
|
|
74
|
+
.addExercise('chest', ['triceps'], ['warmup', 'normal', 'normal', 'failure'])
|
|
75
|
+
.build();
|
|
76
|
+
const splitWithWarmup = (0, muscleSplits_1.calculateSimplifiedMuscleSplit)({
|
|
77
|
+
workoutsOrRoutines: [workout],
|
|
78
|
+
includeWarmupSets: true,
|
|
79
|
+
});
|
|
80
|
+
expect(splitWithWarmup.chest).toBe(4);
|
|
81
|
+
expect(splitWithWarmup.arms).toBe(4 * 0.5);
|
|
82
|
+
const splitWithoutWarmup = (0, muscleSplits_1.calculateSimplifiedMuscleSplit)({
|
|
83
|
+
workoutsOrRoutines: [workout],
|
|
84
|
+
includeWarmupSets: false,
|
|
85
|
+
});
|
|
86
|
+
expect(splitWithoutWarmup.chest).toBe(3);
|
|
87
|
+
expect(splitWithoutWarmup.arms).toBe(3 * 0.5);
|
|
88
|
+
});
|
|
89
|
+
it('should count a set as 1 for a simplified group even if primary and other muscles are in the same group', () => {
|
|
90
|
+
const workout = new SetCountableWorkoutOrRoutineBuilder()
|
|
91
|
+
.addExercise('quadriceps', ['hamstrings', 'glutes'], // also in legs
|
|
92
|
+
['normal'])
|
|
93
|
+
.build();
|
|
94
|
+
const split = (0, muscleSplits_1.calculateSimplifiedMuscleSplit)({
|
|
95
|
+
workoutsOrRoutines: [workout],
|
|
96
|
+
includeWarmupSets: false,
|
|
97
|
+
});
|
|
98
|
+
expect(split.legs).toBe(1);
|
|
99
|
+
expect(split.chest).toBe(0);
|
|
100
|
+
expect(split.back).toBe(0);
|
|
101
|
+
expect(split.shoulders).toBe(0);
|
|
102
|
+
expect(split.arms).toBe(0);
|
|
103
|
+
expect(split.core).toBe(0);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('calculateSetContributionsForMuscleGroups', () => {
|
|
107
|
+
it('should return 1 for the main muscle group and 0.5 for others', () => {
|
|
108
|
+
const contributions = (0, muscleSplits_1.calculateSetContributionsForMuscleGroups)({
|
|
109
|
+
muscleGroup: 'chest',
|
|
110
|
+
otherMuscles: ['shoulders', 'triceps'],
|
|
111
|
+
});
|
|
112
|
+
expect(contributions.chest).toBe(1);
|
|
113
|
+
expect(contributions.shoulders).toBe(0.5);
|
|
114
|
+
expect(contributions.triceps).toBe(0.5);
|
|
115
|
+
expect(contributions.lats).toBe(0);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('calculateSetCountPerMuscleGroups', () => {
|
|
119
|
+
it('should calculate the set count per muscle group', () => {
|
|
120
|
+
const workout = new SetCountableWorkoutOrRoutineBuilder()
|
|
121
|
+
.addExercise('chest', ['shoulders', 'triceps'], ['normal', 'normal', 'normal'])
|
|
122
|
+
.addExercise('lats', ['biceps'], ['normal', 'normal'])
|
|
123
|
+
.build();
|
|
124
|
+
const counts = (0, muscleSplits_1.calculateSetCountPerMuscleGroups)({
|
|
125
|
+
workoutsOrRoutines: [workout],
|
|
126
|
+
includeWarmupSets: false,
|
|
127
|
+
});
|
|
128
|
+
expect(counts.chest).toBe(3);
|
|
129
|
+
expect(counts.shoulders).toBe(3 * 0.5);
|
|
130
|
+
expect(counts.triceps).toBe(3 * 0.5);
|
|
131
|
+
expect(counts.lats).toBe(2);
|
|
132
|
+
expect(counts.biceps).toBe(2 * 0.5);
|
|
133
|
+
expect(counts.abdominals).toBe(0);
|
|
134
|
+
});
|
|
135
|
+
it('should handle warmup sets correctly', () => {
|
|
136
|
+
const workout = new SetCountableWorkoutOrRoutineBuilder()
|
|
137
|
+
.addExercise('chest', ['shoulders', 'triceps'], ['warmup', 'normal', 'normal'])
|
|
138
|
+
.build();
|
|
139
|
+
const countsWithWarmup = (0, muscleSplits_1.calculateSetCountPerMuscleGroups)({
|
|
140
|
+
workoutsOrRoutines: [workout],
|
|
141
|
+
includeWarmupSets: true,
|
|
142
|
+
});
|
|
143
|
+
expect(countsWithWarmup.chest).toBe(3);
|
|
144
|
+
expect(countsWithWarmup.shoulders).toBe(3 * 0.5);
|
|
145
|
+
const countsWithoutWarmup = (0, muscleSplits_1.calculateSetCountPerMuscleGroups)({
|
|
146
|
+
workoutsOrRoutines: [workout],
|
|
147
|
+
includeWarmupSets: false,
|
|
148
|
+
});
|
|
149
|
+
expect(countsWithoutWarmup.chest).toBe(2);
|
|
150
|
+
expect(countsWithoutWarmup.shoulders).toBe(2 * 0.5);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|