hevy-shared 1.0.984 → 1.0.986
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/hevyTrainer.d.ts +2 -2
- package/built/hevyTrainer.js +30 -40
- package/built/index.d.ts +2 -1
- package/built/index.js +7 -2
- package/built/tests/hevyTrainer.test.js +17 -17
- package/package.json +2 -2
package/built/hevyTrainer.d.ts
CHANGED
|
@@ -226,10 +226,10 @@ type PickExerciseResult<T extends HevyTrainerLibraryExercise> = {
|
|
|
226
226
|
exercise?: T;
|
|
227
227
|
trace: ExerciseSelectionTrace;
|
|
228
228
|
};
|
|
229
|
-
export declare function
|
|
229
|
+
export declare function pickTrainerExercise<T extends HevyTrainerLibraryExercise>(params: ExerciseSelectionParams<T> & {
|
|
230
230
|
withTrace: true;
|
|
231
231
|
}): PickExerciseResult<T>;
|
|
232
|
-
export declare function
|
|
232
|
+
export declare function pickTrainerExercise<T extends HevyTrainerLibraryExercise>(params: ExerciseSelectionParams<T>): T | undefined;
|
|
233
233
|
export type HevyTrainerLibraryExercise = Pick<LibraryExercise, 'id' | 'title' | 'priority' | 'muscle_group' | 'other_muscles' | 'exercise_type' | 'equipment_category' | 'category' | 'level' | 'goal' | 'granular_equipments'>;
|
|
234
234
|
export declare const DEFAULT_TRAINER_CARDIO_ATTACHMENT_DURATION_SECONDS = 600;
|
|
235
235
|
export interface ExercisePrescriptionError {
|
package/built/hevyTrainer.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DEFAULT_TRAINER_CARDIO_ATTACHMENT_DURATION_SECONDS = exports.getPrioritySortedExercises = exports.isEquipmentCompatible = exports.normalizeExerciseCategory = exports.getTrainerRestTimerSeconds = exports.getTrainerRepRange = exports.getTrainerSetCount = exports.isTrainerProgramCardioExercise = exports.isTrainerProgramResistanceExercise = exports.programSplits = exports.frequencyMap = exports.routineNames = exports.defaultDurationPerFrequency = exports.hevyTrainerExerciseCategories = exports.granularEquipmentsToTrainerEquipments = exports.trainerEquipmentToGranularEquipments = exports.granularEquipmentDefaults = exports.trainerGymTypes = exports.workoutDurationOptions = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.pickTrainerExercise = pickTrainerExercise;
|
|
5
5
|
exports.generateProgram = generateProgram;
|
|
6
6
|
const _1 = require(".");
|
|
7
7
|
exports.workoutDurationOptions = [40, 60, 80];
|
|
@@ -455,7 +455,7 @@ const findAlternativeIsolationExercise = (exercises, criteria, context) => {
|
|
|
455
455
|
return matchesCriteria && isNotUsed;
|
|
456
456
|
});
|
|
457
457
|
};
|
|
458
|
-
const
|
|
458
|
+
const pickTrainerExerciseWithTrace = (params) => {
|
|
459
459
|
const { sortedExercises, handPickedExercises, criteria, context } = params;
|
|
460
460
|
const trace = { entries: [] };
|
|
461
461
|
const exercises = handPickedExercises
|
|
@@ -534,46 +534,35 @@ const pickExerciseForPrescriptionWithTrace = (params) => {
|
|
|
534
534
|
? { exercise, trace: Object.assign(Object.assign({}, trace), { selectedPass: 6 }) }
|
|
535
535
|
: { exercise: undefined, trace };
|
|
536
536
|
};
|
|
537
|
-
function
|
|
537
|
+
function pickTrainerExercise(params) {
|
|
538
538
|
if (params.withTrace) {
|
|
539
|
-
return
|
|
539
|
+
return pickTrainerExerciseWithTrace(params);
|
|
540
540
|
}
|
|
541
|
-
return
|
|
541
|
+
return pickTrainerExerciseWithTrace(params).exercise;
|
|
542
542
|
}
|
|
543
543
|
const CARDIO_TRACE_INDEX_BEFORE_TEMPLATE = -1;
|
|
544
544
|
exports.DEFAULT_TRAINER_CARDIO_ATTACHMENT_DURATION_SECONDS = 600;
|
|
545
|
-
const appendCardioExerciseSelectionTrace = (traces, params) => {
|
|
546
|
-
traces.push({
|
|
547
|
-
traceKind: 'cardio',
|
|
548
|
-
routine: params.routine,
|
|
549
|
-
prescriptionIndex: params.prescriptionIndex,
|
|
550
|
-
selectedExerciseId: params.selectedExerciseId,
|
|
551
|
-
equipments: params.equipments,
|
|
552
|
-
level: params.level,
|
|
553
|
-
trace: {
|
|
554
|
-
entries: [
|
|
555
|
-
{
|
|
556
|
-
pass: 1,
|
|
557
|
-
label: 'cardio: first priority exercise matching equipment + level; globally excluded IDs skipped',
|
|
558
|
-
candidatePoolSize: params.candidatePoolSize,
|
|
559
|
-
selectedExerciseId: params.selectedExerciseId,
|
|
560
|
-
},
|
|
561
|
-
],
|
|
562
|
-
selectedPass: 1,
|
|
563
|
-
},
|
|
564
|
-
});
|
|
565
|
-
};
|
|
566
545
|
/** Inserts optional cardio before or after template exercises for one routine. */
|
|
567
|
-
const attachOptionalCardioToRoutine = ({ cardioPreference,
|
|
546
|
+
const attachOptionalCardioToRoutine = ({ cardioPreference, sortedExercises, criteria, debugExerciseSelectionTrace, exerciseSelectionTraces, routine, templatePrescriptionCount, routineExercises, }) => {
|
|
568
547
|
if (cardioPreference === 'no-cardio')
|
|
569
548
|
return;
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
549
|
+
// Cardio is reusable across routines, so program/routine used-id contexts are
|
|
550
|
+
// intentionally omitted — only the global excluded set applies.
|
|
551
|
+
const selectionParams = {
|
|
552
|
+
sortedExercises,
|
|
553
|
+
criteria: {
|
|
554
|
+
frequency: criteria.frequency,
|
|
555
|
+
goal: criteria.goal,
|
|
556
|
+
level: criteria.level,
|
|
557
|
+
equipments: criteria.equipments,
|
|
558
|
+
muscleGroup: 'cardio',
|
|
559
|
+
exerciseCategory: 'all',
|
|
560
|
+
routineBarbellExerciseCount: 0,
|
|
561
|
+
},
|
|
562
|
+
context: { excludedExerciseIds: criteria.excludedExerciseIds },
|
|
563
|
+
};
|
|
564
|
+
const selection = pickTrainerExercise(Object.assign(Object.assign({}, selectionParams), { withTrace: true }));
|
|
565
|
+
const cardioExercise = selection.exercise;
|
|
577
566
|
if (!cardioExercise)
|
|
578
567
|
return;
|
|
579
568
|
const slot = {
|
|
@@ -586,7 +575,8 @@ const attachOptionalCardioToRoutine = ({ cardioPreference, cardioExercises, crit
|
|
|
586
575
|
else
|
|
587
576
|
routineExercises.push(slot);
|
|
588
577
|
if (debugExerciseSelectionTrace) {
|
|
589
|
-
|
|
578
|
+
exerciseSelectionTraces.push({
|
|
579
|
+
traceKind: 'cardio',
|
|
590
580
|
routine,
|
|
591
581
|
prescriptionIndex: cardioPreference === 'workout-start'
|
|
592
582
|
? CARDIO_TRACE_INDEX_BEFORE_TEMPLATE
|
|
@@ -594,7 +584,7 @@ const attachOptionalCardioToRoutine = ({ cardioPreference, cardioExercises, crit
|
|
|
594
584
|
selectedExerciseId: cardioExercise.id,
|
|
595
585
|
equipments: criteria.equipments,
|
|
596
586
|
level: criteria.level,
|
|
597
|
-
|
|
587
|
+
trace: selection.trace,
|
|
598
588
|
});
|
|
599
589
|
}
|
|
600
590
|
};
|
|
@@ -648,7 +638,7 @@ function generateProgram(params) {
|
|
|
648
638
|
};
|
|
649
639
|
let exercise;
|
|
650
640
|
if (debugExerciseSelectionTrace) {
|
|
651
|
-
const selection =
|
|
641
|
+
const selection = pickTrainerExercise({
|
|
652
642
|
sortedExercises,
|
|
653
643
|
criteria,
|
|
654
644
|
context: {
|
|
@@ -671,7 +661,7 @@ function generateProgram(params) {
|
|
|
671
661
|
});
|
|
672
662
|
}
|
|
673
663
|
else {
|
|
674
|
-
exercise =
|
|
664
|
+
exercise = pickTrainerExercise({
|
|
675
665
|
sortedExercises,
|
|
676
666
|
criteria,
|
|
677
667
|
context: {
|
|
@@ -719,8 +709,8 @@ function generateProgram(params) {
|
|
|
719
709
|
}
|
|
720
710
|
attachOptionalCardioToRoutine({
|
|
721
711
|
cardioPreference,
|
|
722
|
-
|
|
723
|
-
criteria: { equipments, level, excludedExerciseIds },
|
|
712
|
+
sortedExercises,
|
|
713
|
+
criteria: { equipments, level, goal, frequency, excludedExerciseIds },
|
|
724
714
|
debugExerciseSelectionTrace,
|
|
725
715
|
exerciseSelectionTraces,
|
|
726
716
|
routine,
|
package/built/index.d.ts
CHANGED
|
@@ -647,11 +647,12 @@ export declare const trainingGoals: readonly ["strength", "build_muscle", "fat_l
|
|
|
647
647
|
export declare const trainingLevels: readonly ["beginner", "intermediate", "advanced"];
|
|
648
648
|
export declare const exerciseCategories: readonly ["isolation", "compound", "assistance-compound"];
|
|
649
649
|
export declare const restTimerLengths: readonly ["short", "medium", "long"];
|
|
650
|
+
export declare const cardioPreferences: readonly ["no-cardio", "workout-start", "workout-end"];
|
|
650
651
|
export type TrainingGoal = Lookup<typeof trainingGoals>;
|
|
651
652
|
export type TrainingLevel = Lookup<typeof trainingLevels>;
|
|
652
653
|
export type ExerciseCategory = Lookup<typeof exerciseCategories>;
|
|
653
654
|
export type RestTimerLength = typeof restTimerLengths[number];
|
|
654
|
-
export type CardioPreference =
|
|
655
|
+
export type CardioPreference = typeof cardioPreferences[number];
|
|
655
656
|
export type HevyTrainerProgramEquipment = Extract<Equipment, 'barbell' | 'dumbbell' | 'machine'>;
|
|
656
657
|
export declare const hevyTrainerProgramEquipments: readonly ["barbell", "dumbbell", "machine"];
|
|
657
658
|
export declare const granularEquipments: readonly ["barbell", "dumbbell", "kettlebell", "plate", "medicine_ball", "ez_bar", "landmine", "trap_bar", "pullup_bar", "dip_bar", "squat_rack", "flat_bench", "adjustable_bench", "dual_cable_machine", "single_cable_machine", "lat_pulldown_cable", "leg_press_machine", "smith_machine", "t_bar", "plate_machines", "stack_machines", "treadmill", "elliptical_trainer", "rowing_machine", "spinning", "stair_machine", "air_bike", "suspension_band", "resistance_band", "battle_rope", "rings", "jump_rope"];
|
package/built/index.js
CHANGED
|
@@ -14,8 +14,8 @@ 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.
|
|
18
|
-
exports.isOAuthScope = exports.supportedScopes = exports.isSuggestedUserSource = exports.isValidUserWorkoutMetricsType = exports.isBodyMeasurementKey = exports.measurementsList = exports.isHevyTrainerRoutine = exports.isWorkoutBiometrics = void 0;
|
|
17
|
+
exports.isPublicWorkout = exports.isSetType = exports.isRPE = exports.validRpeValues = exports.isSetPersonalRecordType = exports.weeklyTrainingFrequencies = exports.isGranularEquipment = exports.granularEquipments = exports.hevyTrainerProgramEquipments = exports.cardioPreferences = 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 = exports.isHeartRateSamples = void 0;
|
|
19
19
|
const typeUtils_1 = require("./typeUtils");
|
|
20
20
|
__exportStar(require("./schemas"), exports);
|
|
21
21
|
__exportStar(require("./constants"), exports);
|
|
@@ -230,6 +230,11 @@ exports.exerciseCategories = [
|
|
|
230
230
|
'assistance-compound',
|
|
231
231
|
];
|
|
232
232
|
exports.restTimerLengths = ['short', 'medium', 'long'];
|
|
233
|
+
exports.cardioPreferences = [
|
|
234
|
+
'no-cardio',
|
|
235
|
+
'workout-start',
|
|
236
|
+
'workout-end',
|
|
237
|
+
];
|
|
233
238
|
exports.hevyTrainerProgramEquipments = [
|
|
234
239
|
'barbell',
|
|
235
240
|
'dumbbell',
|
|
@@ -381,11 +381,11 @@ const chestOnlySorted = (exercises) => {
|
|
|
381
381
|
}, {});
|
|
382
382
|
return Object.assign(Object.assign({}, empty), { chest: exercises });
|
|
383
383
|
};
|
|
384
|
-
describe('
|
|
384
|
+
describe('pickTrainerExercise', () => {
|
|
385
385
|
it('pass 1: returns the first matching exercise that is not used in the program', () => {
|
|
386
386
|
const used = makeExercise({ id: 'used' });
|
|
387
387
|
const fresh = makeExercise({ id: 'fresh' });
|
|
388
|
-
const result = (0, hevyTrainer_1.
|
|
388
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
389
389
|
sortedExercises: chestOnlySorted([used, fresh]),
|
|
390
390
|
criteria: baseCriteria(),
|
|
391
391
|
context: {
|
|
@@ -396,7 +396,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
396
396
|
});
|
|
397
397
|
it('pass 2: falls back to exercises not used in the current routine when all are used in the program', () => {
|
|
398
398
|
const onlyExercise = makeExercise({ id: 'only' });
|
|
399
|
-
const result = (0, hevyTrainer_1.
|
|
399
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
400
400
|
sortedExercises: chestOnlySorted([onlyExercise]),
|
|
401
401
|
criteria: baseCriteria(),
|
|
402
402
|
context: {
|
|
@@ -411,7 +411,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
411
411
|
it('excludes exercises in `excludedExerciseIds` across all passes', () => {
|
|
412
412
|
const excluded = makeExercise({ id: 'excluded' });
|
|
413
413
|
const alternative = makeExercise({ id: 'alt' });
|
|
414
|
-
const result = (0, hevyTrainer_1.
|
|
414
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
415
415
|
sortedExercises: chestOnlySorted([excluded, alternative]),
|
|
416
416
|
criteria: baseCriteria(),
|
|
417
417
|
context: {
|
|
@@ -421,7 +421,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
421
421
|
expect(result === null || result === void 0 ? void 0 : result.id).toBe('alt');
|
|
422
422
|
});
|
|
423
423
|
it('returns undefined when no exercise satisfies any pass', () => {
|
|
424
|
-
const result = (0, hevyTrainer_1.
|
|
424
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
425
425
|
sortedExercises: chestOnlySorted([]),
|
|
426
426
|
criteria: baseCriteria(),
|
|
427
427
|
context: {},
|
|
@@ -437,7 +437,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
437
437
|
id: 'bw',
|
|
438
438
|
granular_equipments: [],
|
|
439
439
|
});
|
|
440
|
-
const result = (0, hevyTrainer_1.
|
|
440
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
441
441
|
sortedExercises: chestOnlySorted([needsBarbell, bodyweight]),
|
|
442
442
|
criteria: baseCriteria({ equipments: [] }),
|
|
443
443
|
context: {},
|
|
@@ -448,7 +448,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
448
448
|
const wrongLevel = makeExercise({ id: 'wrong', level: ['advanced'] });
|
|
449
449
|
const wrongGoal = makeExercise({ id: 'wrongGoal', goal: ['fat_loss'] });
|
|
450
450
|
const rightOne = makeExercise({ id: 'right' });
|
|
451
|
-
const result = (0, hevyTrainer_1.
|
|
451
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
452
452
|
sortedExercises: chestOnlySorted([wrongLevel, wrongGoal, rightOne]),
|
|
453
453
|
criteria: baseCriteria({ level: 'beginner', goal: 'strength' }),
|
|
454
454
|
context: {},
|
|
@@ -458,7 +458,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
458
458
|
it('considers handpicked exercises before sortedExercises', () => {
|
|
459
459
|
const hand = makeExercise({ id: 'hand' });
|
|
460
460
|
const sorted = makeExercise({ id: 'sorted' });
|
|
461
|
-
const result = (0, hevyTrainer_1.
|
|
461
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
462
462
|
sortedExercises: chestOnlySorted([sorted]),
|
|
463
463
|
handPickedExercises: [hand],
|
|
464
464
|
criteria: baseCriteria(),
|
|
@@ -473,7 +473,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
473
473
|
id: 'compound',
|
|
474
474
|
category: 'compound',
|
|
475
475
|
});
|
|
476
|
-
const result = (0, hevyTrainer_1.
|
|
476
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
477
477
|
sortedExercises: chestOnlySorted([compoundOnly]),
|
|
478
478
|
criteria: baseCriteria({ exerciseCategory: 'isolation' }),
|
|
479
479
|
context: {},
|
|
@@ -491,7 +491,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
491
491
|
return acc;
|
|
492
492
|
}, {});
|
|
493
493
|
sorted.shoulders = [secondaryChest];
|
|
494
|
-
const result = (0, hevyTrainer_1.
|
|
494
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
495
495
|
sortedExercises: sorted,
|
|
496
496
|
criteria: baseCriteria({ muscleGroup: 'chest' }),
|
|
497
497
|
context: {},
|
|
@@ -502,7 +502,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
502
502
|
const barbellExercise = (id) => makeExercise({ id, equipment_category: 'barbell' });
|
|
503
503
|
it('allows barbell exercises regardless of count when frequency > 1', () => {
|
|
504
504
|
const ex = barbellExercise('bench');
|
|
505
|
-
const result = (0, hevyTrainer_1.
|
|
505
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
506
506
|
sortedExercises: chestOnlySorted([ex]),
|
|
507
507
|
criteria: baseCriteria({
|
|
508
508
|
frequency: 3,
|
|
@@ -515,7 +515,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
515
515
|
});
|
|
516
516
|
it('allows barbell exercises under the cap when frequency === 1', () => {
|
|
517
517
|
const ex = barbellExercise('bench');
|
|
518
|
-
const result = (0, hevyTrainer_1.
|
|
518
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
519
519
|
sortedExercises: chestOnlySorted([ex]),
|
|
520
520
|
criteria: baseCriteria({
|
|
521
521
|
frequency: 1,
|
|
@@ -528,7 +528,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
528
528
|
});
|
|
529
529
|
it('rejects barbell exercises at or over the cap when a substitute is available', () => {
|
|
530
530
|
const ex = barbellExercise('bench');
|
|
531
|
-
const result = (0, hevyTrainer_1.
|
|
531
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
532
532
|
sortedExercises: chestOnlySorted([ex]),
|
|
533
533
|
criteria: baseCriteria({
|
|
534
534
|
frequency: 1,
|
|
@@ -542,7 +542,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
542
542
|
});
|
|
543
543
|
it('still allows barbell exercises over the cap when the user has no substitutes', () => {
|
|
544
544
|
const ex = barbellExercise('bench');
|
|
545
|
-
const result = (0, hevyTrainer_1.
|
|
545
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
546
546
|
sortedExercises: chestOnlySorted([ex]),
|
|
547
547
|
criteria: baseCriteria({
|
|
548
548
|
frequency: 1,
|
|
@@ -558,7 +558,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
558
558
|
it('returns a trace when `withTrace: true` and records the winning pass', () => {
|
|
559
559
|
var _a;
|
|
560
560
|
const fresh = makeExercise({ id: 'fresh' });
|
|
561
|
-
const result = (0, hevyTrainer_1.
|
|
561
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
562
562
|
sortedExercises: chestOnlySorted([fresh]),
|
|
563
563
|
criteria: baseCriteria(),
|
|
564
564
|
context: {},
|
|
@@ -572,7 +572,7 @@ describe('pickExerciseForPrescription', () => {
|
|
|
572
572
|
});
|
|
573
573
|
});
|
|
574
574
|
it('returns a trace with no selected pass when nothing matches', () => {
|
|
575
|
-
const result = (0, hevyTrainer_1.
|
|
575
|
+
const result = (0, hevyTrainer_1.pickTrainerExercise)({
|
|
576
576
|
sortedExercises: chestOnlySorted([]),
|
|
577
577
|
criteria: baseCriteria(),
|
|
578
578
|
context: {},
|
|
@@ -899,7 +899,7 @@ describe('generateProgram', () => {
|
|
|
899
899
|
expect(result.success).toBe(true);
|
|
900
900
|
expect(result.exerciseSelectionTraces.map((t) => t.prescriptionIndex)).toEqual([0, 1]);
|
|
901
901
|
});
|
|
902
|
-
it('records a single cardio trace entry
|
|
902
|
+
it('records a single cardio trace entry on pass 1', () => {
|
|
903
903
|
const settings = makeSettings();
|
|
904
904
|
settings.templates.full_body_1 = {
|
|
905
905
|
exercises: [{ muscle_group: 'chest', category: 'compound' }],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hevy-shared",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.986",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "built/index.js",
|
|
6
6
|
"types": "built/index.d.ts",
|
|
@@ -52,6 +52,6 @@
|
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"dayjs": "^1.11.19",
|
|
54
54
|
"lodash": "^4.17.21",
|
|
55
|
-
"zod": "3.24.
|
|
55
|
+
"zod": "3.24.2"
|
|
56
56
|
}
|
|
57
57
|
}
|