hevy-shared 1.0.962 → 1.0.963
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 +17 -2
- package/built/API/APIClient.d.ts +157 -0
- package/built/API/APIClient.js +381 -0
- package/built/API/index.d.ts +2 -0
- package/built/API/index.js +18 -0
- package/built/API/types.d.ts +38 -0
- package/built/API/types.js +18 -0
- package/built/adjustEventTokens.d.ts +16 -0
- package/built/adjustEventTokens.js +18 -0
- package/built/adminPermissions.d.ts +4 -0
- package/built/adminPermissions.js +22 -0
- package/built/async.d.ts +50 -0
- package/built/async.js +170 -0
- package/built/chat.d.ts +25 -23
- package/built/coachPlans.d.ts +2 -1
- package/built/coachPlans.js +2 -2
- package/built/cue.d.ts +12 -0
- package/built/cue.js +22 -0
- package/built/exerciseLocaleUtils.d.ts +17 -0
- package/built/exerciseLocaleUtils.js +62 -0
- package/built/filterExercises.d.ts +19 -3
- package/built/filterExercises.js +72 -60
- package/built/hevyTrainer.d.ts +250 -0
- package/built/hevyTrainer.js +676 -0
- package/built/index.d.ts +1140 -304
- package/built/index.js +269 -75
- package/built/muscleHeatmaps.d.ts +31 -0
- package/built/muscleHeatmaps.js +68 -0
- package/built/muscleSplits.d.ts +36 -0
- package/built/muscleSplits.js +100 -0
- package/built/normalizedWorkoutUtils.d.ts +88 -0
- package/built/normalizedWorkoutUtils.js +112 -0
- package/built/notifications.d.ts +215 -0
- package/built/notifications.js +9 -0
- package/built/routineUtils.d.ts +14 -0
- package/built/routineUtils.js +186 -0
- package/built/schemas.d.ts +14 -0
- package/built/schemas.js +9 -0
- package/built/setIndicatorUtils.d.ts +4 -3
- package/built/setIndicatorUtils.js +15 -1
- package/built/tests/async.test.d.ts +1 -0
- package/built/tests/async.test.js +49 -0
- package/built/tests/hevyTrainer.test.d.ts +1 -0
- package/built/tests/hevyTrainer.test.js +1199 -0
- package/built/tests/muscleSplit.test.d.ts +1 -0
- package/built/tests/muscleSplit.test.js +153 -0
- package/built/tests/routineUtils.test.d.ts +1 -0
- package/built/tests/routineUtils.test.js +745 -0
- package/built/tests/testUtils.d.ts +85 -0
- package/built/tests/testUtils.js +319 -0
- package/built/tests/utils.test.js +748 -0
- package/built/tests/workoutVolume.test.js +165 -49
- package/built/translations/index.d.ts +2 -0
- package/built/translations/index.js +18 -0
- package/built/translations/translationUtils.d.ts +2 -0
- package/built/translations/translationUtils.js +61 -0
- package/built/translations/types.d.ts +8 -0
- package/built/translations/types.js +20 -0
- package/built/typeUtils.d.ts +70 -0
- package/built/typeUtils.js +55 -0
- package/built/units.d.ts +14 -7
- package/built/units.js +24 -14
- package/built/utils.d.ts +192 -5
- package/built/utils.js +598 -85
- package/built/websocket.d.ts +14 -2
- package/built/workoutVolume.d.ts +24 -5
- package/built/workoutVolume.js +25 -34
- package/package.json +32 -10
- package/.eslintignore +0 -2
- package/.eslintrc +0 -21
- package/.github/workflows/ci.yml +0 -15
- package/.github/workflows/npm-publish.yml +0 -59
- package/.github/workflows/pr-auto-assign.yml +0 -15
- package/.prettierrc.js +0 -5
- package/jest.config.js +0 -4
- package/src/chat.ts +0 -130
- package/src/coachPlans.ts +0 -57
- package/src/constants.ts +0 -14
- package/src/filterExercises.ts +0 -222
- package/src/index.ts +0 -1576
- package/src/setIndicatorUtils.ts +0 -137
- package/src/tests/utils.test.ts +0 -156
- package/src/tests/workoutVolume.test.ts +0 -93
- package/src/units.ts +0 -41
- package/src/utils.ts +0 -516
- package/src/websocket.ts +0 -36
- package/src/workoutVolume.ts +0 -175
- package/tsconfig.json +0 -70
package/built/index.js
CHANGED
|
@@ -14,7 +14,10 @@ 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.
|
|
17
|
+
exports.isHeartRateSamples = exports.isPublicWorkout = exports.isSetType = exports.isRPE = exports.validRpeValues = exports.isSetPersonalRecordType = exports.weeklyTrainingFrequencies = exports.isGranularEquipment = exports.granularEquipments = exports.hevyTrainerProgramEquipments = exports.restTimerLengths = 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.simplifiedMuscleGroupToMuscleGroups = 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.parseClientAuthTokenResponse = exports.isCoachRole = exports.isErrorResponse = exports.isLivePRVolumeOption = exports.isTimerVolumeOption = exports.isWeekday = exports.orderedWeekdays = exports.isBodyMeasurementUnit = exports.isDistanceUnitShort = exports.isDistanceUnit = exports.isWeightUnit = void 0;
|
|
18
|
+
exports.isOAuthScope = exports.supportedScopes = exports.isSuggestedUserSource = exports.isValidUserWorkoutMetricsType = exports.isBodyMeasurementKey = exports.measurementsList = exports.isHevyTrainerRoutine = exports.isWorkoutBiometrics = void 0;
|
|
19
|
+
const typeUtils_1 = require("./typeUtils");
|
|
20
|
+
__exportStar(require("./schemas"), exports);
|
|
18
21
|
__exportStar(require("./constants"), exports);
|
|
19
22
|
__exportStar(require("./utils"), exports);
|
|
20
23
|
__exportStar(require("./units"), exports);
|
|
@@ -24,23 +27,19 @@ __exportStar(require("./workoutVolume"), exports);
|
|
|
24
27
|
__exportStar(require("./coachPlans"), exports);
|
|
25
28
|
__exportStar(require("./chat"), exports);
|
|
26
29
|
__exportStar(require("./websocket"), exports);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
'ko',
|
|
41
|
-
].includes(x);
|
|
42
|
-
};
|
|
43
|
-
exports.isLanguage = isLanguage;
|
|
30
|
+
__exportStar(require("./cue"), exports);
|
|
31
|
+
__exportStar(require("./muscleHeatmaps"), exports);
|
|
32
|
+
__exportStar(require("./muscleSplits"), exports);
|
|
33
|
+
__exportStar(require("./notifications"), exports);
|
|
34
|
+
__exportStar(require("./normalizedWorkoutUtils"), exports);
|
|
35
|
+
__exportStar(require("./routineUtils"), exports);
|
|
36
|
+
__exportStar(require("./typeUtils"), exports);
|
|
37
|
+
__exportStar(require("./async"), exports);
|
|
38
|
+
__exportStar(require("./adminPermissions"), exports);
|
|
39
|
+
__exportStar(require("./adjustEventTokens"), exports);
|
|
40
|
+
__exportStar(require("./hevyTrainer"), exports);
|
|
41
|
+
__exportStar(require("./translations"), exports);
|
|
42
|
+
__exportStar(require("./exerciseLocaleUtils"), exports);
|
|
44
43
|
const isWeightUnit = (x) => {
|
|
45
44
|
return x === 'kg' || x === 'lbs';
|
|
46
45
|
};
|
|
@@ -57,61 +56,119 @@ const isBodyMeasurementUnit = (x) => {
|
|
|
57
56
|
return x === 'cm' || x === 'in';
|
|
58
57
|
};
|
|
59
58
|
exports.isBodyMeasurementUnit = isBodyMeasurementUnit;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
/** Monday is first */
|
|
60
|
+
exports.orderedWeekdays = [
|
|
61
|
+
'monday',
|
|
62
|
+
'tuesday',
|
|
63
|
+
'wednesday',
|
|
64
|
+
'thursday',
|
|
65
|
+
'friday',
|
|
66
|
+
'saturday',
|
|
67
|
+
'sunday',
|
|
68
|
+
];
|
|
69
|
+
const isWeekday = (x) => (0, typeUtils_1.isInArray)(x, exports.orderedWeekdays);
|
|
69
70
|
exports.isWeekday = isWeekday;
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
};
|
|
71
|
+
const _timerVolumeOptions = ['off', 'low', 'normal', 'high'];
|
|
72
|
+
const isTimerVolumeOption = (x) => (0, typeUtils_1.isInArray)(x, _timerVolumeOptions);
|
|
73
73
|
exports.isTimerVolumeOption = isTimerVolumeOption;
|
|
74
|
+
const _livePRVolumeOption = ['off', 'low', 'normal', 'high'];
|
|
75
|
+
const isLivePRVolumeOption = (x) => (0, typeUtils_1.isInArray)(x, _livePRVolumeOption);
|
|
76
|
+
exports.isLivePRVolumeOption = isLivePRVolumeOption;
|
|
74
77
|
const isErrorResponse = (x) => {
|
|
75
78
|
return typeof (x === null || x === void 0 ? void 0 : x.error) === 'string';
|
|
76
79
|
};
|
|
77
80
|
exports.isErrorResponse = isErrorResponse;
|
|
81
|
+
const _coachRoles = ['member', 'admin', 'owner'];
|
|
82
|
+
const isCoachRole = (role) => (0, typeUtils_1.isInArray)(role, _coachRoles);
|
|
83
|
+
exports.isCoachRole = isCoachRole;
|
|
84
|
+
const parseClientAuthTokenResponse = (data) => typeof data === 'object' &&
|
|
85
|
+
!!data &&
|
|
86
|
+
typeof data.access_token === 'string' &&
|
|
87
|
+
data.access_token.length > 0 &&
|
|
88
|
+
typeof data.refresh_token === 'string' &&
|
|
89
|
+
data.refresh_token.length > 0 &&
|
|
90
|
+
typeof data.expires_at === 'string' &&
|
|
91
|
+
data.expires_at.length > 0 &&
|
|
92
|
+
!!new Date(data.expires_at).valueOf()
|
|
93
|
+
? {
|
|
94
|
+
access_token: data.access_token,
|
|
95
|
+
refresh_token: data.refresh_token,
|
|
96
|
+
expires_at: new Date(data.expires_at),
|
|
97
|
+
}
|
|
98
|
+
: null;
|
|
99
|
+
exports.parseClientAuthTokenResponse = parseClientAuthTokenResponse;
|
|
78
100
|
exports.DefaultClientConfiguration = {
|
|
79
101
|
is_chat_enabled: false,
|
|
102
|
+
are_notifications_enabled: true,
|
|
80
103
|
};
|
|
81
|
-
|
|
82
|
-
'
|
|
83
|
-
'
|
|
84
|
-
'
|
|
85
|
-
'
|
|
86
|
-
'
|
|
87
|
-
'
|
|
88
|
-
'
|
|
89
|
-
|
|
104
|
+
const _supportedProStores = [
|
|
105
|
+
'app_store',
|
|
106
|
+
'play_store',
|
|
107
|
+
'stripe',
|
|
108
|
+
'hevy-gift',
|
|
109
|
+
'gympass',
|
|
110
|
+
'paddle',
|
|
111
|
+
'hevy-coach',
|
|
112
|
+
];
|
|
113
|
+
exports.coreMuscles = ['abdominals'];
|
|
114
|
+
exports.shoulderMuscles = ['shoulders'];
|
|
115
|
+
exports.armMuscles = ['biceps', 'triceps', 'forearms'];
|
|
116
|
+
exports.legMuscles = [
|
|
117
|
+
'quadriceps',
|
|
118
|
+
'hamstrings',
|
|
90
119
|
'calves',
|
|
91
|
-
'forearms',
|
|
92
120
|
'glutes',
|
|
93
|
-
'
|
|
121
|
+
'abductors',
|
|
122
|
+
'adductors',
|
|
123
|
+
];
|
|
124
|
+
exports.backMuscles = [
|
|
94
125
|
'lats',
|
|
95
|
-
'
|
|
96
|
-
'shoulders',
|
|
97
|
-
'triceps',
|
|
126
|
+
'upper_back',
|
|
98
127
|
'traps',
|
|
128
|
+
'lower_back',
|
|
129
|
+
];
|
|
130
|
+
exports.chestMuscles = ['chest'];
|
|
131
|
+
exports.miscellaneousMuscles = [
|
|
132
|
+
'cardio',
|
|
99
133
|
'neck',
|
|
100
134
|
'full_body',
|
|
101
135
|
'other',
|
|
102
136
|
];
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
'
|
|
109
|
-
|
|
137
|
+
exports.simplifiedMuscleGroups = [
|
|
138
|
+
'core',
|
|
139
|
+
'shoulders',
|
|
140
|
+
'arms',
|
|
141
|
+
'legs',
|
|
142
|
+
'back',
|
|
143
|
+
'chest',
|
|
110
144
|
];
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
145
|
+
const isSimplifiedMuscleGroup = (x) => (0, typeUtils_1.isInArray)(x, exports.simplifiedMuscleGroups);
|
|
146
|
+
exports.isSimplifiedMuscleGroup = isSimplifiedMuscleGroup;
|
|
147
|
+
exports.muscleGroups = [
|
|
148
|
+
...exports.coreMuscles,
|
|
149
|
+
...exports.shoulderMuscles,
|
|
150
|
+
...exports.armMuscles,
|
|
151
|
+
...exports.legMuscles,
|
|
152
|
+
...exports.backMuscles,
|
|
153
|
+
...exports.chestMuscles,
|
|
154
|
+
...exports.miscellaneousMuscles,
|
|
155
|
+
];
|
|
156
|
+
const isMuscleGroup = (x) => (0, typeUtils_1.isInArray)(x, exports.muscleGroups);
|
|
157
|
+
exports.isMuscleGroup = isMuscleGroup;
|
|
158
|
+
exports.muscleGroupFilters = ['all_muscles', ...exports.muscleGroups];
|
|
159
|
+
const isMuscleGroupFilter = (x) => (0, typeUtils_1.isInArray)(x, exports.muscleGroupFilters);
|
|
114
160
|
exports.isMuscleGroupFilter = isMuscleGroupFilter;
|
|
161
|
+
exports.simplifiedMuscleGroupToMuscleGroups = {
|
|
162
|
+
chest: exports.chestMuscles,
|
|
163
|
+
shoulders: exports.shoulderMuscles,
|
|
164
|
+
back: exports.backMuscles,
|
|
165
|
+
arms: exports.armMuscles,
|
|
166
|
+
legs: exports.legMuscles,
|
|
167
|
+
core: exports.coreMuscles,
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* Equipment
|
|
171
|
+
*/
|
|
115
172
|
exports.equipments = [
|
|
116
173
|
'none',
|
|
117
174
|
'barbell',
|
|
@@ -123,24 +180,23 @@ exports.equipments = [
|
|
|
123
180
|
'suspension',
|
|
124
181
|
'other',
|
|
125
182
|
];
|
|
126
|
-
|
|
127
|
-
'all_equipment',
|
|
128
|
-
...exports.equipments,
|
|
129
|
-
];
|
|
130
|
-
const isEquipment = (x) => {
|
|
131
|
-
return exports.equipments.includes(x);
|
|
132
|
-
};
|
|
183
|
+
const isEquipment = (x) => (0, typeUtils_1.isInArray)(x, exports.equipments);
|
|
133
184
|
exports.isEquipment = isEquipment;
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
};
|
|
185
|
+
exports.equipmentFilters = ['all_equipment', ...exports.equipments];
|
|
186
|
+
const isEquipmentFilter = (x) => (0, typeUtils_1.isInArray)(x, exports.equipmentFilters);
|
|
137
187
|
exports.isEquipmentFilter = isEquipmentFilter;
|
|
138
|
-
exports.
|
|
188
|
+
exports.exerciseRepTypes = [
|
|
139
189
|
'weight_reps',
|
|
140
190
|
'reps_only',
|
|
141
|
-
'bodyweight_reps',
|
|
191
|
+
'bodyweight_reps', // This is actually used for weighted bodyweight exercises (eg weighted pull ups)
|
|
142
192
|
'bodyweight_assisted_reps',
|
|
193
|
+
];
|
|
194
|
+
const isExerciseRepType = (x) => (0, typeUtils_1.isInArray)(x, exports.exerciseRepTypes);
|
|
195
|
+
exports.isExerciseRepType = isExerciseRepType;
|
|
196
|
+
exports.exerciseTypes = [
|
|
197
|
+
...exports.exerciseRepTypes,
|
|
143
198
|
'duration',
|
|
199
|
+
'weight_duration',
|
|
144
200
|
'distance_duration',
|
|
145
201
|
/**
|
|
146
202
|
* Note on short_distance_weight exercises. The UI makes it look like we support yards and meters
|
|
@@ -153,21 +209,159 @@ exports.exerciseTypes = [
|
|
|
153
209
|
* from yards<->meters.
|
|
154
210
|
*/
|
|
155
211
|
'short_distance_weight',
|
|
212
|
+
/**
|
|
213
|
+
* At the time of writing, the only exercise that uses these types are Stair Machine (Floors)
|
|
214
|
+
* and Stair Machine (Steps) respectively.
|
|
215
|
+
*/
|
|
216
|
+
'floors_duration',
|
|
217
|
+
'steps_duration',
|
|
156
218
|
];
|
|
157
|
-
const isExerciseType = (x) =>
|
|
158
|
-
return typeof x === 'string' && exports.exerciseTypes.includes(x);
|
|
159
|
-
};
|
|
219
|
+
const isExerciseType = (x) => (0, typeUtils_1.isInArray)(x, exports.exerciseTypes);
|
|
160
220
|
exports.isExerciseType = isExerciseType;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
221
|
+
exports.customExericseTypes = exports.exerciseTypes.filter((type) => type !== 'floors_duration' && type !== 'steps_duration');
|
|
222
|
+
const isCustomExerciseType = (x) => (0, typeUtils_1.isInArray)(x, exports.customExericseTypes);
|
|
223
|
+
exports.isCustomExerciseType = isCustomExerciseType;
|
|
224
|
+
// Hevy Trainer related types
|
|
225
|
+
exports.trainingGoals = ['strength', 'build_muscle', 'fat_loss'];
|
|
226
|
+
exports.trainingLevels = ['beginner', 'intermediate', 'advanced'];
|
|
227
|
+
exports.exerciseCategories = [
|
|
228
|
+
'isolation',
|
|
229
|
+
'compound',
|
|
230
|
+
'assistance-compound',
|
|
231
|
+
];
|
|
232
|
+
exports.restTimerLengths = ['short', 'medium', 'long'];
|
|
233
|
+
exports.hevyTrainerProgramEquipments = [
|
|
234
|
+
'barbell',
|
|
235
|
+
'dumbbell',
|
|
236
|
+
'machine',
|
|
237
|
+
];
|
|
238
|
+
exports.granularEquipments = [
|
|
239
|
+
'barbell',
|
|
240
|
+
'dumbbell',
|
|
241
|
+
'kettlebell',
|
|
242
|
+
'plate',
|
|
243
|
+
'medicine_ball',
|
|
244
|
+
'ez_bar',
|
|
245
|
+
'landmine',
|
|
246
|
+
'trap_bar',
|
|
247
|
+
'pullup_bar',
|
|
248
|
+
'dip_bar',
|
|
249
|
+
'squat_rack',
|
|
250
|
+
'flat_bench',
|
|
251
|
+
'adjustable_bench',
|
|
252
|
+
'dual_cable_machine',
|
|
253
|
+
'single_cable_machine',
|
|
254
|
+
'lat_pulldown_cable',
|
|
255
|
+
'leg_press_machine',
|
|
256
|
+
'smith_machine',
|
|
257
|
+
't_bar',
|
|
258
|
+
'plate_machines',
|
|
259
|
+
'stack_machines',
|
|
260
|
+
'treadmill',
|
|
261
|
+
'elliptical_trainer',
|
|
262
|
+
'rowing_machine',
|
|
263
|
+
'spinning',
|
|
264
|
+
'stair_machine',
|
|
265
|
+
'air_bike',
|
|
266
|
+
'suspension_band',
|
|
267
|
+
'resistance_band',
|
|
268
|
+
'battle_rope',
|
|
269
|
+
'rings',
|
|
270
|
+
'jump_rope',
|
|
271
|
+
];
|
|
272
|
+
const isGranularEquipment = (x) => (0, typeUtils_1.isInArray)(x, exports.granularEquipments);
|
|
273
|
+
exports.isGranularEquipment = isGranularEquipment;
|
|
274
|
+
exports.weeklyTrainingFrequencies = [1, 2, 3, 4, 5, 6];
|
|
275
|
+
// Workouts
|
|
276
|
+
const _setPersonalRecordTypes = [
|
|
277
|
+
'best_weight',
|
|
278
|
+
'best_reps',
|
|
279
|
+
'best_volume',
|
|
280
|
+
'best_1rm',
|
|
281
|
+
'best_duration',
|
|
282
|
+
'best_distance',
|
|
283
|
+
'most_floors',
|
|
284
|
+
'most_steps',
|
|
285
|
+
];
|
|
286
|
+
const isSetPersonalRecordType = (x) => (0, typeUtils_1.isInArray)(x, _setPersonalRecordTypes);
|
|
287
|
+
exports.isSetPersonalRecordType = isSetPersonalRecordType;
|
|
165
288
|
exports.validRpeValues = [6, 7, 7.5, 8, 8.5, 9, 9.5, 10];
|
|
289
|
+
const isRPE = (x) => (0, typeUtils_1.isInArray)(x, exports.validRpeValues);
|
|
290
|
+
exports.isRPE = isRPE;
|
|
291
|
+
const _setTypes = ['warmup', 'normal', 'failure', 'dropset'];
|
|
292
|
+
const isSetType = (x) => (0, typeUtils_1.isInArray)(x, _setTypes);
|
|
293
|
+
exports.isSetType = isSetType;
|
|
166
294
|
const isPublicWorkout = (x) => {
|
|
167
295
|
return x.type === 'public';
|
|
168
296
|
};
|
|
169
297
|
exports.isPublicWorkout = isPublicWorkout;
|
|
170
|
-
const
|
|
171
|
-
|
|
298
|
+
const isHeartRateSamples = (x) => {
|
|
299
|
+
if (!x || !Array.isArray(x))
|
|
300
|
+
return false;
|
|
301
|
+
for (const sample of x) {
|
|
302
|
+
if (typeof sample.timestamp_ms !== 'number' ||
|
|
303
|
+
typeof sample.bpm !== 'number') {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return true;
|
|
308
|
+
};
|
|
309
|
+
exports.isHeartRateSamples = isHeartRateSamples;
|
|
310
|
+
const isWorkoutBiometrics = (x) => {
|
|
311
|
+
if (!x)
|
|
312
|
+
return false;
|
|
313
|
+
const maybeCalories = x.total_calories;
|
|
314
|
+
const maybeHeartRateSamples = x.heart_rate_samples;
|
|
315
|
+
const caloriesAreValid = maybeCalories === undefined ||
|
|
316
|
+
(typeof maybeCalories === 'number' && maybeCalories >= 0);
|
|
317
|
+
const heartSamplesAreValid = maybeHeartRateSamples === undefined ||
|
|
318
|
+
(0, exports.isHeartRateSamples)(maybeHeartRateSamples);
|
|
319
|
+
return caloriesAreValid && heartSamplesAreValid;
|
|
172
320
|
};
|
|
321
|
+
exports.isWorkoutBiometrics = isWorkoutBiometrics;
|
|
322
|
+
const isHevyTrainerRoutine = (routine) => routine.hevy_trainer_program_id !== null;
|
|
323
|
+
exports.isHevyTrainerRoutine = isHevyTrainerRoutine;
|
|
324
|
+
exports.measurementsList = [
|
|
325
|
+
'weight_kg',
|
|
326
|
+
'lean_mass_kg',
|
|
327
|
+
'fat_percent',
|
|
328
|
+
'neck_cm',
|
|
329
|
+
'shoulder_cm',
|
|
330
|
+
'chest_cm',
|
|
331
|
+
'left_bicep_cm',
|
|
332
|
+
'right_bicep_cm',
|
|
333
|
+
'left_forearm_cm',
|
|
334
|
+
'right_forearm_cm',
|
|
335
|
+
'abdomen',
|
|
336
|
+
'waist',
|
|
337
|
+
'hips',
|
|
338
|
+
'left_thigh',
|
|
339
|
+
'right_thigh',
|
|
340
|
+
'left_calf',
|
|
341
|
+
'right_calf',
|
|
342
|
+
];
|
|
343
|
+
const isBodyMeasurementKey = (key) => (0, typeUtils_1.isInArray)(key, exports.measurementsList);
|
|
344
|
+
exports.isBodyMeasurementKey = isBodyMeasurementKey;
|
|
345
|
+
const _validUserWorkoutMetricsTypes = ['duration', 'reps'];
|
|
346
|
+
const isValidUserWorkoutMetricsType = (x) => (0, typeUtils_1.isInArray)(x, _validUserWorkoutMetricsTypes);
|
|
173
347
|
exports.isValidUserWorkoutMetricsType = isValidUserWorkoutMetricsType;
|
|
348
|
+
const _suggestedUserSources = [
|
|
349
|
+
'popular',
|
|
350
|
+
'local',
|
|
351
|
+
'contact',
|
|
352
|
+
'mutual_follows',
|
|
353
|
+
'follows_you',
|
|
354
|
+
'featured',
|
|
355
|
+
'hyper_local',
|
|
356
|
+
];
|
|
357
|
+
const isSuggestedUserSource = (source) => (0, typeUtils_1.isInArray)(source, _suggestedUserSources);
|
|
358
|
+
exports.isSuggestedUserSource = isSuggestedUserSource;
|
|
359
|
+
exports.supportedScopes = [
|
|
360
|
+
'read-workout',
|
|
361
|
+
'modify-workout',
|
|
362
|
+
'read-routine',
|
|
363
|
+
'modify-routine',
|
|
364
|
+
'unrestricted',
|
|
365
|
+
];
|
|
366
|
+
const isOAuthScope = (x) => (0, typeUtils_1.isInArray)(x, exports.supportedScopes);
|
|
367
|
+
exports.isOAuthScope = isOAuthScope;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { MuscleGroup } from '.';
|
|
2
|
+
import { Lookup } from './typeUtils';
|
|
3
|
+
declare const _muscleHeatmapKeys: readonly ["abdominals", "shoulders", "chest", "lower_back", "biceps", "triceps", "upper_back", "quadriceps", "calves", "lats", "hamstrings", "glutes", "abductors", "adductors", "traps", "forearms", "neck"];
|
|
4
|
+
export type MuscleHeatmapKey = Lookup<typeof _muscleHeatmapKeys>;
|
|
5
|
+
export declare const isMuscleHeatmapKey: (x: string) => x is MuscleHeatmapKey;
|
|
6
|
+
export type MuscleHeatmapData = {
|
|
7
|
+
[key in MuscleHeatmapKey]?: number;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Calculates muscle group opacity from exercise data: primary muscle groups are 1.0, secondary are 0.5
|
|
11
|
+
*/
|
|
12
|
+
export declare const getMuscleHeatmapDataForExercises: (exercises: ({
|
|
13
|
+
muscle_group: MuscleGroup;
|
|
14
|
+
other_muscles: MuscleGroup[];
|
|
15
|
+
} | undefined)[]) => MuscleHeatmapData;
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @param workoutsOrRoutines An array of objects with an array of exercises
|
|
19
|
+
* @param getExerciseTemplateWithId A function that returns an ExerciseTemplate (or undefined) given an ID
|
|
20
|
+
* @returns MuscleHeatmapData with a value that represents how much a muscle group was used in the workouts or routines:
|
|
21
|
+
* A primary muscle counts as 1.0 per workout/routine, and a secondary muscle counts as 0.5 per workout/routine
|
|
22
|
+
*/
|
|
23
|
+
export declare const getMuscleHeatmapDataForWorkoutsOrRoutines: ({ workoutsOrRoutines, }: {
|
|
24
|
+
workoutsOrRoutines: {
|
|
25
|
+
exercises: {
|
|
26
|
+
muscle_group: MuscleGroup;
|
|
27
|
+
other_muscles: MuscleGroup[];
|
|
28
|
+
}[];
|
|
29
|
+
}[];
|
|
30
|
+
}) => MuscleHeatmapData;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMuscleHeatmapDataForWorkoutsOrRoutines = exports.getMuscleHeatmapDataForExercises = exports.isMuscleHeatmapKey = void 0;
|
|
4
|
+
const typeUtils_1 = require("./typeUtils");
|
|
5
|
+
const _muscleHeatmapKeys = [
|
|
6
|
+
'abdominals',
|
|
7
|
+
'shoulders',
|
|
8
|
+
'chest',
|
|
9
|
+
'lower_back',
|
|
10
|
+
'biceps',
|
|
11
|
+
'triceps',
|
|
12
|
+
'upper_back',
|
|
13
|
+
'quadriceps',
|
|
14
|
+
'calves',
|
|
15
|
+
'lats',
|
|
16
|
+
'hamstrings',
|
|
17
|
+
'glutes',
|
|
18
|
+
'abductors',
|
|
19
|
+
'adductors',
|
|
20
|
+
'traps',
|
|
21
|
+
'forearms',
|
|
22
|
+
'neck',
|
|
23
|
+
];
|
|
24
|
+
const isMuscleHeatmapKey = (x) => (0, typeUtils_1.isInArray)(x, _muscleHeatmapKeys);
|
|
25
|
+
exports.isMuscleHeatmapKey = isMuscleHeatmapKey;
|
|
26
|
+
/**
|
|
27
|
+
* Calculates muscle group opacity from exercise data: primary muscle groups are 1.0, secondary are 0.5
|
|
28
|
+
*/
|
|
29
|
+
const getMuscleHeatmapDataForExercises = (exercises) => {
|
|
30
|
+
var _a;
|
|
31
|
+
// initialise all keys to 0
|
|
32
|
+
const data = _muscleHeatmapKeys.reduce((prev, curr) => (Object.assign(Object.assign({}, prev), { [curr]: 0 })), {});
|
|
33
|
+
for (const e of exercises) {
|
|
34
|
+
if (!e)
|
|
35
|
+
continue;
|
|
36
|
+
if ((0, exports.isMuscleHeatmapKey)(e.muscle_group)) {
|
|
37
|
+
data[e.muscle_group] = 1;
|
|
38
|
+
}
|
|
39
|
+
for (const m of e.other_muscles) {
|
|
40
|
+
if ((0, exports.isMuscleHeatmapKey)(m)) {
|
|
41
|
+
data[m] = Math.max((_a = data[m]) !== null && _a !== void 0 ? _a : 0, 0.5);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return data;
|
|
46
|
+
};
|
|
47
|
+
exports.getMuscleHeatmapDataForExercises = getMuscleHeatmapDataForExercises;
|
|
48
|
+
/**
|
|
49
|
+
*
|
|
50
|
+
* @param workoutsOrRoutines An array of objects with an array of exercises
|
|
51
|
+
* @param getExerciseTemplateWithId A function that returns an ExerciseTemplate (or undefined) given an ID
|
|
52
|
+
* @returns MuscleHeatmapData with a value that represents how much a muscle group was used in the workouts or routines:
|
|
53
|
+
* A primary muscle counts as 1.0 per workout/routine, and a secondary muscle counts as 0.5 per workout/routine
|
|
54
|
+
*/
|
|
55
|
+
const getMuscleHeatmapDataForWorkoutsOrRoutines = ({ workoutsOrRoutines, }) => {
|
|
56
|
+
// initialise all keys to 0
|
|
57
|
+
const data = _muscleHeatmapKeys.reduce((prev, curr) => (Object.assign(Object.assign({}, prev), { [curr]: 0 })), {});
|
|
58
|
+
workoutsOrRoutines.forEach((workoutOrRoutine) => {
|
|
59
|
+
const muscleData = (0, exports.getMuscleHeatmapDataForExercises)(workoutOrRoutine.exercises);
|
|
60
|
+
Object.keys(muscleData).forEach((muscle) => {
|
|
61
|
+
data[muscle] =
|
|
62
|
+
(data[muscle] || 0) +
|
|
63
|
+
(muscleData[muscle] || 0);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
return data;
|
|
67
|
+
};
|
|
68
|
+
exports.getMuscleHeatmapDataForWorkoutsOrRoutines = getMuscleHeatmapDataForWorkoutsOrRoutines;
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
}) => {
|
|
17
|
+
core: number;
|
|
18
|
+
shoulders: number;
|
|
19
|
+
arms: number;
|
|
20
|
+
legs: number;
|
|
21
|
+
back: number;
|
|
22
|
+
chest: number;
|
|
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 {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.calculateSetCountPerMuscleGroups = exports.calculateSetContributionsForMuscleGroups = exports.calculateSimplifiedMuscleSplit = exports.calculateSetContributionsForSimplifiedMuscleGroups = void 0;
|
|
7
|
+
const intersection_1 = __importDefault(require("lodash/intersection"));
|
|
8
|
+
const _1 = require(".");
|
|
9
|
+
const calculateSetContributionsForSimplifiedMuscleGroups = ({ muscle_group, other_muscles, }) => {
|
|
10
|
+
const getContribution = (mg) => {
|
|
11
|
+
if (mg.includes(muscle_group)) {
|
|
12
|
+
return 1;
|
|
13
|
+
}
|
|
14
|
+
else if ((0, intersection_1.default)(mg, other_muscles).length) {
|
|
15
|
+
return 0.5;
|
|
16
|
+
}
|
|
17
|
+
else if (muscle_group === 'full_body') {
|
|
18
|
+
return 1 / 6;
|
|
19
|
+
}
|
|
20
|
+
return 0;
|
|
21
|
+
};
|
|
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;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
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;
|
|
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;
|
|
99
|
+
};
|
|
100
|
+
exports.calculateSetCountPerMuscleGroups = calculateSetCountPerMuscleGroups;
|