@sunsteel/contracts 0.63.0 → 0.65.0

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/dist/index.cjs CHANGED
@@ -44,6 +44,13 @@ __export(index_exports, {
44
44
  COMEBACK_REQUIRED_ACTIVE_DAYS: () => COMEBACK_REQUIRED_ACTIVE_DAYS,
45
45
  COMEBACK_SESSION_LOOKBACK: () => COMEBACK_SESSION_LOOKBACK,
46
46
  COMEBACK_WINDOW_DAYS: () => COMEBACK_WINDOW_DAYS,
47
+ DELOAD_DEFAULT_DAYS: () => DELOAD_DEFAULT_DAYS,
48
+ DELOAD_DEFAULT_LOAD_REDUCTION: () => DELOAD_DEFAULT_LOAD_REDUCTION,
49
+ DELOAD_DEFAULT_SET_MODE: () => DELOAD_DEFAULT_SET_MODE,
50
+ DELOAD_LOAD_REDUCTIONS: () => DELOAD_LOAD_REDUCTIONS,
51
+ DELOAD_MAX_DAYS: () => DELOAD_MAX_DAYS,
52
+ DELOAD_NOT_LIGHTER: () => DELOAD_NOT_LIGHTER,
53
+ DELOAD_SET_MODES: () => DELOAD_SET_MODES,
47
54
  EXERCISE_EQUIPMENT: () => EXERCISE_EQUIPMENT,
48
55
  EXERCISE_MECHANICS: () => EXERCISE_MECHANICS,
49
56
  FEATURED_PROFILE_ITEMS_MAX: () => FEATURED_PROFILE_ITEMS_MAX,
@@ -132,6 +139,8 @@ __export(index_exports, {
132
139
  SHARED_ROUTINE_SOURCES: () => SHARED_ROUTINE_SOURCES,
133
140
  STARRED_EXERCISES_MAX: () => STARRED_EXERCISES_MAX,
134
141
  STREAK_MAX_GAP_DAYS: () => STREAK_MAX_GAP_DAYS,
142
+ TEMPORARY_OVERRIDE_KINDS: () => TEMPORARY_OVERRIDE_KINDS,
143
+ TEMPORARY_OVERRIDE_SOURCE_KINDS: () => TEMPORARY_OVERRIDE_SOURCE_KINDS,
135
144
  TRAINING_DISCIPLINE_VALUES: () => TRAINING_DISCIPLINE_VALUES,
136
145
  TRAINING_EVENT_TYPES: () => TRAINING_EVENT_TYPES,
137
146
  TRAINING_EXPERIENCE_LEVEL_VALUES: () => TRAINING_EXPERIENCE_LEVEL_VALUES,
@@ -148,11 +157,16 @@ __export(index_exports, {
148
157
  WEIGHT_UNITS: () => WEIGHT_UNITS,
149
158
  WORKOUT_SESSION_STATUSES: () => WORKOUT_SESSION_STATUSES,
150
159
  accountExportFileName: () => accountExportFileName,
160
+ applyDeload: () => applyDeload,
161
+ deloadLengthDays: () => deloadLengthDays,
151
162
  isWithinQuietHours: () => isWithinQuietHours,
152
163
  matchesDeletionConfirmation: () => matchesDeletionConfirmation,
164
+ resolveActiveTrainingBlock: () => resolveActiveTrainingBlock,
165
+ resolveRoutinePlan: () => resolveRoutinePlan,
153
166
  routineDayLabel: () => routineDayLabel,
154
167
  sessionCorrectionWindow: () => sessionCorrectionWindow,
155
- setLogValuesDiffer: () => setLogValuesDiffer
168
+ setLogValuesDiffer: () => setLogValuesDiffer,
169
+ trainingBlockCovers: () => trainingBlockCovers
156
170
  });
157
171
  module.exports = __toCommonJS(index_exports);
158
172
 
@@ -521,6 +535,118 @@ var ROUTINE_TRAINING_BLOCK_SOURCE_KINDS = [
521
535
  "CURRENT_ROUTINE",
522
536
  "SAVED_VERSION"
523
537
  ];
538
+ function trainingBlockCovers(block, date) {
539
+ return block.startDate <= date && date <= block.endDate;
540
+ }
541
+ function resolveActiveTrainingBlock(blocks, date) {
542
+ return blocks?.find((block) => trainingBlockCovers(block, date)) ?? null;
543
+ }
544
+ function resolveRoutinePlan(routine, date) {
545
+ const block = resolveActiveTrainingBlock(routine.trainingBlocks, date);
546
+ const deload = resolveActiveTrainingBlock(routine.temporaryOverrides, date);
547
+ const blockInForce = block ? {
548
+ id: block.id,
549
+ seriesId: block.seriesId,
550
+ revision: block.revision,
551
+ name: block.name,
552
+ startDate: block.startDate,
553
+ endDate: block.endDate
554
+ } : null;
555
+ if (deload) {
556
+ return {
557
+ block: blockInForce,
558
+ override: {
559
+ id: deload.id,
560
+ kind: deload.kind,
561
+ startDate: deload.startDate,
562
+ endDate: deload.endDate
563
+ },
564
+ scheduleMode: deload.scheduleMode,
565
+ restDays: deload.restDays,
566
+ rotationWeekdays: deload.rotationWeekdays,
567
+ nextRotationDayId: deload.nextRotationDayId,
568
+ days: deload.days
569
+ };
570
+ }
571
+ if (block) {
572
+ return {
573
+ override: null,
574
+ block: {
575
+ id: block.id,
576
+ seriesId: block.seriesId,
577
+ revision: block.revision,
578
+ name: block.name,
579
+ startDate: block.startDate,
580
+ endDate: block.endDate
581
+ },
582
+ scheduleMode: block.scheduleMode,
583
+ restDays: block.restDays,
584
+ rotationWeekdays: block.rotationWeekdays,
585
+ nextRotationDayId: block.nextRotationDayId,
586
+ days: block.days
587
+ };
588
+ }
589
+ return {
590
+ block: null,
591
+ override: null,
592
+ scheduleMode: routine.scheduleMode,
593
+ restDays: routine.restDays,
594
+ rotationWeekdays: routine.rotationWeekdays ?? [],
595
+ nextRotationDayId: routine.nextRotationDayId ?? null,
596
+ days: routine.days
597
+ };
598
+ }
599
+
600
+ // src/deloads.ts
601
+ var DELOAD_MAX_DAYS = 14;
602
+ var DELOAD_DEFAULT_DAYS = 7;
603
+ var DELOAD_LOAD_REDUCTIONS = [0, 10, 20, 30, 40];
604
+ var DELOAD_DEFAULT_LOAD_REDUCTION = 10;
605
+ var DELOAD_SET_MODES = ["ALL", "HALF"];
606
+ var DELOAD_DEFAULT_SET_MODE = "HALF";
607
+ var TEMPORARY_OVERRIDE_KINDS = ["DELOAD"];
608
+ var TEMPORARY_OVERRIDE_SOURCE_KINDS = [
609
+ "BASELINE",
610
+ "TRAINING_BLOCK"
611
+ ];
612
+ var DELOAD_NOT_LIGHTER = "Those options leave every set as it is: choose a lighter load or fewer sets";
613
+ var lighterOnGrid = (original, target, increment) => {
614
+ const step = increment > 0 ? increment : 2.5;
615
+ const stepped = Math.round(Math.round(target / step) * step * 1e3) / 1e3;
616
+ return stepped > 0 && stepped < original ? stepped : original;
617
+ };
618
+ function applyDeload(setup, options) {
619
+ const factor = 1 - options.loadReductionPercent / 100;
620
+ let lighter = false;
621
+ const days = setup.days.map((day) => ({
622
+ ...day,
623
+ exercises: day.exercises.map((exercise) => {
624
+ const kept = options.setMode === "HALF" ? exercise.sets.slice(0, Math.ceil(exercise.sets.length / 2)) : exercise.sets;
625
+ if (kept.length < exercise.sets.length) lighter = true;
626
+ return {
627
+ ...exercise,
628
+ sets: kept.map((set) => {
629
+ if (typeof set.weight !== "number" || set.weight <= 0) {
630
+ return { ...set };
631
+ }
632
+ if (factor === 1) return { ...set };
633
+ const weight = lighterOnGrid(
634
+ set.weight,
635
+ set.weight * factor,
636
+ exercise.minWeightIncrement
637
+ );
638
+ if (weight < set.weight) lighter = true;
639
+ return { ...set, weight };
640
+ })
641
+ };
642
+ })
643
+ }));
644
+ return lighter ? { ...setup, days } : null;
645
+ }
646
+ function deloadLengthDays(startDate, endDate) {
647
+ const ms = (date) => Date.parse(`${date}T00:00:00Z`);
648
+ return Math.round((ms(endDate) - ms(startDate)) / 864e5) + 1;
649
+ }
524
650
 
525
651
  // src/routine-sharing.ts
526
652
  var ROUTINE_VISIBILITY_VALUES = [
@@ -761,6 +887,13 @@ function accountExportFileName(username, exportedAt) {
761
887
  COMEBACK_REQUIRED_ACTIVE_DAYS,
762
888
  COMEBACK_SESSION_LOOKBACK,
763
889
  COMEBACK_WINDOW_DAYS,
890
+ DELOAD_DEFAULT_DAYS,
891
+ DELOAD_DEFAULT_LOAD_REDUCTION,
892
+ DELOAD_DEFAULT_SET_MODE,
893
+ DELOAD_LOAD_REDUCTIONS,
894
+ DELOAD_MAX_DAYS,
895
+ DELOAD_NOT_LIGHTER,
896
+ DELOAD_SET_MODES,
764
897
  EXERCISE_EQUIPMENT,
765
898
  EXERCISE_MECHANICS,
766
899
  FEATURED_PROFILE_ITEMS_MAX,
@@ -849,6 +982,8 @@ function accountExportFileName(username, exportedAt) {
849
982
  SHARED_ROUTINE_SOURCES,
850
983
  STARRED_EXERCISES_MAX,
851
984
  STREAK_MAX_GAP_DAYS,
985
+ TEMPORARY_OVERRIDE_KINDS,
986
+ TEMPORARY_OVERRIDE_SOURCE_KINDS,
852
987
  TRAINING_DISCIPLINE_VALUES,
853
988
  TRAINING_EVENT_TYPES,
854
989
  TRAINING_EXPERIENCE_LEVEL_VALUES,
@@ -865,9 +1000,14 @@ function accountExportFileName(username, exportedAt) {
865
1000
  WEIGHT_UNITS,
866
1001
  WORKOUT_SESSION_STATUSES,
867
1002
  accountExportFileName,
1003
+ applyDeload,
1004
+ deloadLengthDays,
868
1005
  isWithinQuietHours,
869
1006
  matchesDeletionConfirmation,
1007
+ resolveActiveTrainingBlock,
1008
+ resolveRoutinePlan,
870
1009
  routineDayLabel,
871
1010
  sessionCorrectionWindow,
872
- setLogValuesDiffer
1011
+ setLogValuesDiffer,
1012
+ trainingBlockCovers
873
1013
  });