@sunsteel/contracts 0.64.0 → 0.66.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.js CHANGED
@@ -371,8 +371,34 @@ function resolveActiveTrainingBlock(blocks, date) {
371
371
  }
372
372
  function resolveRoutinePlan(routine, date) {
373
373
  const block = resolveActiveTrainingBlock(routine.trainingBlocks, date);
374
+ const deload = resolveActiveTrainingBlock(routine.temporaryOverrides, date);
375
+ const blockInForce = block ? {
376
+ id: block.id,
377
+ seriesId: block.seriesId,
378
+ revision: block.revision,
379
+ name: block.name,
380
+ startDate: block.startDate,
381
+ endDate: block.endDate
382
+ } : null;
383
+ if (deload) {
384
+ return {
385
+ block: blockInForce,
386
+ override: {
387
+ id: deload.id,
388
+ kind: deload.kind,
389
+ startDate: deload.startDate,
390
+ endDate: deload.endDate
391
+ },
392
+ scheduleMode: deload.scheduleMode,
393
+ restDays: deload.restDays,
394
+ rotationWeekdays: deload.rotationWeekdays,
395
+ nextRotationDayId: deload.nextRotationDayId,
396
+ days: deload.days
397
+ };
398
+ }
374
399
  if (block) {
375
400
  return {
401
+ override: null,
376
402
  block: {
377
403
  id: block.id,
378
404
  seriesId: block.seriesId,
@@ -390,6 +416,7 @@ function resolveRoutinePlan(routine, date) {
390
416
  }
391
417
  return {
392
418
  block: null,
419
+ override: null,
393
420
  scheduleMode: routine.scheduleMode,
394
421
  restDays: routine.restDays,
395
422
  rotationWeekdays: routine.rotationWeekdays ?? [],
@@ -398,6 +425,57 @@ function resolveRoutinePlan(routine, date) {
398
425
  };
399
426
  }
400
427
 
428
+ // src/deloads.ts
429
+ var DELOAD_MAX_DAYS = 14;
430
+ var DELOAD_DEFAULT_DAYS = 7;
431
+ var DELOAD_LOAD_REDUCTIONS = [0, 10, 20, 30, 40];
432
+ var DELOAD_DEFAULT_LOAD_REDUCTION = 10;
433
+ var DELOAD_SET_MODES = ["ALL", "HALF"];
434
+ var DELOAD_DEFAULT_SET_MODE = "HALF";
435
+ var TEMPORARY_OVERRIDE_KINDS = ["DELOAD"];
436
+ var TEMPORARY_OVERRIDE_SOURCE_KINDS = [
437
+ "BASELINE",
438
+ "TRAINING_BLOCK"
439
+ ];
440
+ var DELOAD_NOT_LIGHTER = "Those options leave every set as it is: choose a lighter load or fewer sets";
441
+ var lighterOnGrid = (original, target, increment) => {
442
+ const step = increment > 0 ? increment : 2.5;
443
+ const stepped = Math.round(Math.round(target / step) * step * 1e3) / 1e3;
444
+ return stepped > 0 && stepped < original ? stepped : original;
445
+ };
446
+ function applyDeload(setup, options) {
447
+ const factor = 1 - options.loadReductionPercent / 100;
448
+ let lighter = false;
449
+ const days = setup.days.map((day) => ({
450
+ ...day,
451
+ exercises: day.exercises.map((exercise) => {
452
+ const kept = options.setMode === "HALF" ? exercise.sets.slice(0, Math.ceil(exercise.sets.length / 2)) : exercise.sets;
453
+ if (kept.length < exercise.sets.length) lighter = true;
454
+ return {
455
+ ...exercise,
456
+ sets: kept.map((set) => {
457
+ if (typeof set.weight !== "number" || set.weight <= 0) {
458
+ return { ...set };
459
+ }
460
+ if (factor === 1) return { ...set };
461
+ const weight = lighterOnGrid(
462
+ set.weight,
463
+ set.weight * factor,
464
+ exercise.minWeightIncrement
465
+ );
466
+ if (weight < set.weight) lighter = true;
467
+ return { ...set, weight };
468
+ })
469
+ };
470
+ })
471
+ }));
472
+ return lighter ? { ...setup, days } : null;
473
+ }
474
+ function deloadLengthDays(startDate, endDate) {
475
+ const ms = (date) => Date.parse(`${date}T00:00:00Z`);
476
+ return Math.round((ms(endDate) - ms(startDate)) / 864e5) + 1;
477
+ }
478
+
401
479
  // src/routine-sharing.ts
402
480
  var ROUTINE_VISIBILITY_VALUES = [
403
481
  "PRIVATE",
@@ -537,7 +615,10 @@ var NOTIFICATION_KINDS = [
537
615
  // addressing you, which is why it is worth a notification at all.
538
616
  "ACTIVITY_COMMENT",
539
617
  // SOC-09: one of four fixed, permissioned prompts from an active partner.
540
- "TRAINING_PARTNER_ENCOURAGEMENT"
618
+ "TRAINING_PARTNER_ENCOURAGEMENT",
619
+ // NOTIF-07: selected activity from a partner who currently shares it.
620
+ "TRAINING_PARTNER_SESSION",
621
+ "TRAINING_PARTNER_ACHIEVEMENT"
541
622
  ];
542
623
  var NOTIFICATIONS_LOOKBACK_DAYS = 30;
543
624
  var NOTIFICATIONS_RETENTION_DAYS = 90;
@@ -548,7 +629,9 @@ var PUSH_SUBSCRIPTIONS_MAX = 10;
548
629
  var PUSH_PAYLOAD_KINDS = [
549
630
  "REST_ALERT",
550
631
  "TRAINING_REMINDER",
551
- "STREAK_AT_RISK"
632
+ "STREAK_AT_RISK",
633
+ "TRAINING_PARTNER_SESSION",
634
+ "TRAINING_PARTNER_ACHIEVEMENT"
552
635
  ];
553
636
  var REST_ALERT_MAX_LEAD_SECONDS = 3600;
554
637
  var REST_ALERT_MIN_LEAD_SECONDS = 5;
@@ -569,7 +652,9 @@ var REST_ALERT_REFUSALS = [
569
652
  var NOTIFICATION_CATEGORIES = [
570
653
  "REST_ALERT",
571
654
  "TRAINING_REMINDER",
572
- "STREAK_AT_RISK"
655
+ "STREAK_AT_RISK",
656
+ "TRAINING_PARTNER_SESSION",
657
+ "TRAINING_PARTNER_ACHIEVEMENT"
573
658
  ];
574
659
  var MINUTES_IN_DAY = 1440;
575
660
  function isWithinQuietHours(minuteOfDay, quietHours) {
@@ -636,6 +721,13 @@ export {
636
721
  COMEBACK_REQUIRED_ACTIVE_DAYS,
637
722
  COMEBACK_SESSION_LOOKBACK,
638
723
  COMEBACK_WINDOW_DAYS,
724
+ DELOAD_DEFAULT_DAYS,
725
+ DELOAD_DEFAULT_LOAD_REDUCTION,
726
+ DELOAD_DEFAULT_SET_MODE,
727
+ DELOAD_LOAD_REDUCTIONS,
728
+ DELOAD_MAX_DAYS,
729
+ DELOAD_NOT_LIGHTER,
730
+ DELOAD_SET_MODES,
639
731
  EXERCISE_EQUIPMENT,
640
732
  EXERCISE_MECHANICS,
641
733
  FEATURED_PROFILE_ITEMS_MAX,
@@ -724,6 +816,8 @@ export {
724
816
  SHARED_ROUTINE_SOURCES,
725
817
  STARRED_EXERCISES_MAX,
726
818
  STREAK_MAX_GAP_DAYS,
819
+ TEMPORARY_OVERRIDE_KINDS,
820
+ TEMPORARY_OVERRIDE_SOURCE_KINDS,
727
821
  TRAINING_DISCIPLINE_VALUES,
728
822
  TRAINING_EVENT_TYPES,
729
823
  TRAINING_EXPERIENCE_LEVEL_VALUES,
@@ -740,6 +834,8 @@ export {
740
834
  WEIGHT_UNITS,
741
835
  WORKOUT_SESSION_STATUSES,
742
836
  accountExportFileName,
837
+ applyDeload,
838
+ deloadLengthDays,
743
839
  isWithinQuietHours,
744
840
  matchesDeletionConfirmation,
745
841
  resolveActiveTrainingBlock,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunsteel/contracts",
3
- "version": "0.64.0",
3
+ "version": "0.66.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/ezee969/sunsteel-contracts.git"