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.
Files changed (88) hide show
  1. package/README.md +17 -2
  2. package/built/API/APIClient.d.ts +157 -0
  3. package/built/API/APIClient.js +381 -0
  4. package/built/API/index.d.ts +2 -0
  5. package/built/API/index.js +18 -0
  6. package/built/API/types.d.ts +38 -0
  7. package/built/API/types.js +18 -0
  8. package/built/adjustEventTokens.d.ts +16 -0
  9. package/built/adjustEventTokens.js +18 -0
  10. package/built/adminPermissions.d.ts +4 -0
  11. package/built/adminPermissions.js +22 -0
  12. package/built/async.d.ts +50 -0
  13. package/built/async.js +170 -0
  14. package/built/chat.d.ts +25 -23
  15. package/built/coachPlans.d.ts +2 -1
  16. package/built/coachPlans.js +2 -2
  17. package/built/cue.d.ts +12 -0
  18. package/built/cue.js +22 -0
  19. package/built/exerciseLocaleUtils.d.ts +17 -0
  20. package/built/exerciseLocaleUtils.js +62 -0
  21. package/built/filterExercises.d.ts +19 -3
  22. package/built/filterExercises.js +72 -60
  23. package/built/hevyTrainer.d.ts +250 -0
  24. package/built/hevyTrainer.js +676 -0
  25. package/built/index.d.ts +1140 -304
  26. package/built/index.js +269 -75
  27. package/built/muscleHeatmaps.d.ts +31 -0
  28. package/built/muscleHeatmaps.js +68 -0
  29. package/built/muscleSplits.d.ts +36 -0
  30. package/built/muscleSplits.js +100 -0
  31. package/built/normalizedWorkoutUtils.d.ts +88 -0
  32. package/built/normalizedWorkoutUtils.js +112 -0
  33. package/built/notifications.d.ts +215 -0
  34. package/built/notifications.js +9 -0
  35. package/built/routineUtils.d.ts +14 -0
  36. package/built/routineUtils.js +186 -0
  37. package/built/schemas.d.ts +14 -0
  38. package/built/schemas.js +9 -0
  39. package/built/setIndicatorUtils.d.ts +4 -3
  40. package/built/setIndicatorUtils.js +15 -1
  41. package/built/tests/async.test.d.ts +1 -0
  42. package/built/tests/async.test.js +49 -0
  43. package/built/tests/hevyTrainer.test.d.ts +1 -0
  44. package/built/tests/hevyTrainer.test.js +1199 -0
  45. package/built/tests/muscleSplit.test.d.ts +1 -0
  46. package/built/tests/muscleSplit.test.js +153 -0
  47. package/built/tests/routineUtils.test.d.ts +1 -0
  48. package/built/tests/routineUtils.test.js +745 -0
  49. package/built/tests/testUtils.d.ts +85 -0
  50. package/built/tests/testUtils.js +319 -0
  51. package/built/tests/utils.test.js +748 -0
  52. package/built/tests/workoutVolume.test.js +165 -49
  53. package/built/translations/index.d.ts +2 -0
  54. package/built/translations/index.js +18 -0
  55. package/built/translations/translationUtils.d.ts +2 -0
  56. package/built/translations/translationUtils.js +61 -0
  57. package/built/translations/types.d.ts +8 -0
  58. package/built/translations/types.js +20 -0
  59. package/built/typeUtils.d.ts +70 -0
  60. package/built/typeUtils.js +55 -0
  61. package/built/units.d.ts +14 -7
  62. package/built/units.js +24 -14
  63. package/built/utils.d.ts +192 -5
  64. package/built/utils.js +598 -85
  65. package/built/websocket.d.ts +14 -2
  66. package/built/workoutVolume.d.ts +24 -5
  67. package/built/workoutVolume.js +25 -34
  68. package/package.json +32 -10
  69. package/.eslintignore +0 -2
  70. package/.eslintrc +0 -21
  71. package/.github/workflows/ci.yml +0 -15
  72. package/.github/workflows/npm-publish.yml +0 -59
  73. package/.github/workflows/pr-auto-assign.yml +0 -15
  74. package/.prettierrc.js +0 -5
  75. package/jest.config.js +0 -4
  76. package/src/chat.ts +0 -130
  77. package/src/coachPlans.ts +0 -57
  78. package/src/constants.ts +0 -14
  79. package/src/filterExercises.ts +0 -222
  80. package/src/index.ts +0 -1576
  81. package/src/setIndicatorUtils.ts +0 -137
  82. package/src/tests/utils.test.ts +0 -156
  83. package/src/tests/workoutVolume.test.ts +0 -93
  84. package/src/units.ts +0 -41
  85. package/src/utils.ts +0 -516
  86. package/src/websocket.ts +0 -36
  87. package/src/workoutVolume.ts +0 -175
  88. 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.isValidUserWorkoutMetricsType = exports.isPublicWorkout = exports.validRpeValues = exports.isRPE = exports.isExerciseType = exports.exerciseTypes = exports.isEquipmentFilter = exports.isEquipment = exports.equipmentFilters = exports.equipments = exports.isMuscleGroupFilter = exports.muscleGroupFilters = exports.isMuscleGroup = exports.muscleGroups = exports.DefaultClientConfiguration = exports.isErrorResponse = exports.isTimerVolumeOption = exports.isWeekday = exports.isBodyMeasurementUnit = exports.isDistanceUnitShort = exports.isDistanceUnit = exports.isWeightUnit = exports.isLanguage = void 0;
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
- const isLanguage = (x) => {
28
- return [
29
- 'en',
30
- 'es',
31
- 'de',
32
- 'fr',
33
- 'it',
34
- 'pt',
35
- 'tr',
36
- 'zh_CN',
37
- 'zh_TW',
38
- 'ru',
39
- 'ja',
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
- const isWeekday = (x) => {
61
- return (x === 'monday' ||
62
- x === 'tuesday' ||
63
- x === 'wednesday' ||
64
- x === 'thursday' ||
65
- x === 'friday' ||
66
- x === 'saturday' ||
67
- x === 'sunday');
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 isTimerVolumeOption = (x) => {
71
- return x === 'off' || x === 'low' || x === 'normal' || x === 'high';
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
- exports.muscleGroups = [
82
- 'abdominals',
83
- 'abductors',
84
- 'adductors',
85
- 'biceps',
86
- 'lower_back',
87
- 'upper_back',
88
- 'cardio',
89
- 'chest',
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
- 'hamstrings',
121
+ 'abductors',
122
+ 'adductors',
123
+ ];
124
+ exports.backMuscles = [
94
125
  'lats',
95
- 'quadriceps',
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
- const isMuscleGroup = (x) => {
104
- return exports.muscleGroups.includes(x);
105
- };
106
- exports.isMuscleGroup = isMuscleGroup;
107
- exports.muscleGroupFilters = [
108
- 'all_muscles',
109
- ...exports.muscleGroups,
137
+ exports.simplifiedMuscleGroups = [
138
+ 'core',
139
+ 'shoulders',
140
+ 'arms',
141
+ 'legs',
142
+ 'back',
143
+ 'chest',
110
144
  ];
111
- const isMuscleGroupFilter = (x) => {
112
- return exports.muscleGroupFilters.includes(x);
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
- exports.equipmentFilters = [
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
- const isEquipmentFilter = (x) => {
135
- return exports.equipmentFilters.includes(x);
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.exerciseTypes = [
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
- const isRPE = (x) => {
162
- return exports.validRpeValues.includes(x);
163
- };
164
- exports.isRPE = isRPE;
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 isValidUserWorkoutMetricsType = (x) => {
171
- return typeof x === 'string' && ['duration', 'reps'].includes(x);
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;