@dgpholdings/greatoak-shared 1.2.86 → 1.2.88

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 (106) hide show
  1. package/README.md +148 -148
  2. package/dist/__mocks__/catalog.fixture.d.ts +2 -0
  3. package/dist/__mocks__/catalog.fixture.js +208 -0
  4. package/dist/__mocks__/exercises.mock.d.ts +4 -11
  5. package/dist/__mocks__/exercises.mock.js +82 -41
  6. package/dist/__mocks__/sessions.mock.d.ts +28 -0
  7. package/dist/__mocks__/sessions.mock.js +394 -0
  8. package/dist/__mocks__/testIds.d.ts +9 -0
  9. package/dist/__mocks__/testIds.js +13 -0
  10. package/dist/__mocks__/user.mock.js +3 -1
  11. package/dist/constants/goalJourney.d.ts +108 -0
  12. package/dist/constants/goalJourney.js +443 -0
  13. package/dist/constants/index.d.ts +1 -0
  14. package/dist/constants/index.js +1 -0
  15. package/dist/types/TApiAiExerciseAnalysis.d.ts +2 -1
  16. package/dist/types/TApiClientConstellation.d.ts +33 -0
  17. package/dist/types/TApiClientConstellation.js +13 -0
  18. package/dist/types/TApiExercise.d.ts +5 -3
  19. package/dist/types/TApiUser.d.ts +2 -0
  20. package/dist/types/index.d.ts +1 -0
  21. package/dist/utils/adoptionEngine/scaleProPlan.util.js +9 -4
  22. package/dist/utils/constellation/computeNormalisedLoad.d.ts +48 -0
  23. package/dist/utils/constellation/computeNormalisedLoad.js +150 -0
  24. package/dist/utils/constellation/computeNormalisedLoad.test.d.ts +1 -0
  25. package/dist/utils/constellation/computeNormalisedLoad.test.js +218 -0
  26. package/dist/utils/constellation/evaluateConstellation.d.ts +27 -0
  27. package/dist/utils/constellation/evaluateConstellation.js +135 -0
  28. package/dist/utils/constellation/evaluateConstellation.test.d.ts +1 -0
  29. package/dist/utils/constellation/evaluateConstellation.test.js +93 -0
  30. package/dist/utils/constellation/index.d.ts +18 -0
  31. package/dist/utils/constellation/index.js +29 -0
  32. package/dist/utils/constellation/levelThresholds.d.ts +99 -0
  33. package/dist/utils/constellation/levelThresholds.js +123 -0
  34. package/dist/utils/constellation/starFoundation.d.ts +25 -0
  35. package/dist/utils/constellation/starFoundation.js +54 -0
  36. package/dist/utils/constellation/starFoundation.test.d.ts +1 -0
  37. package/dist/utils/constellation/starFoundation.test.js +75 -0
  38. package/dist/utils/constellation/stars/consistency.d.ts +29 -0
  39. package/dist/utils/constellation/stars/consistency.js +142 -0
  40. package/dist/utils/constellation/stars/consistency.test.d.ts +1 -0
  41. package/dist/utils/constellation/stars/consistency.test.js +94 -0
  42. package/dist/utils/constellation/stars/lowerBody.d.ts +17 -0
  43. package/dist/utils/constellation/stars/lowerBody.js +30 -0
  44. package/dist/utils/constellation/stars/pull.d.ts +11 -0
  45. package/dist/utils/constellation/stars/pull.js +24 -0
  46. package/dist/utils/constellation/stars/push.d.ts +11 -0
  47. package/dist/utils/constellation/stars/push.js +24 -0
  48. package/dist/utils/constellation/stars/quality.d.ts +19 -0
  49. package/dist/utils/constellation/stars/quality.js +98 -0
  50. package/dist/utils/constellation/stars/quality.test.d.ts +1 -0
  51. package/dist/utils/constellation/stars/quality.test.js +113 -0
  52. package/dist/utils/constellation/stars/recovery.d.ts +29 -0
  53. package/dist/utils/constellation/stars/recovery.js +169 -0
  54. package/dist/utils/constellation/stars/recovery.test.d.ts +1 -0
  55. package/dist/utils/constellation/stars/recovery.test.js +131 -0
  56. package/dist/utils/constellation/strengthStar.test.d.ts +1 -0
  57. package/dist/utils/constellation/strengthStar.test.js +190 -0
  58. package/dist/utils/constellation/strengthStarHelpers.d.ts +41 -0
  59. package/dist/utils/constellation/strengthStarHelpers.js +104 -0
  60. package/dist/utils/constellation/types.d.ts +124 -0
  61. package/dist/utils/constellation/types.js +18 -0
  62. package/dist/utils/exerciseRecord/recordValidator.integration.test.js +1 -1
  63. package/dist/utils/exerciseRecord/recordValidator.js +1 -1
  64. package/dist/utils/exerciseRecord/recordValidator.test.js +8 -8
  65. package/dist/utils/index.d.ts +5 -3
  66. package/dist/utils/index.js +1 -0
  67. package/dist/utils/scoringWorkout/calculateQualityScore.d.ts +59 -36
  68. package/dist/utils/scoringWorkout/calculateQualityScore.js +234 -233
  69. package/dist/utils/scoringWorkout/computeMuscleFatigueMap.d.ts +8 -5
  70. package/dist/utils/scoringWorkout/computeMuscleFatigueMap.js +72 -88
  71. package/dist/utils/scoringWorkout/constants.d.ts +20 -6
  72. package/dist/utils/scoringWorkout/constants.js +23 -9
  73. package/dist/utils/scoringWorkout/helpers.d.ts +7 -0
  74. package/dist/utils/scoringWorkout/helpers.js +24 -18
  75. package/dist/utils/scoringWorkout/index.d.ts +12 -8
  76. package/dist/utils/scoringWorkout/index.js +23 -15
  77. package/dist/utils/scoringWorkout/parseRecords.js +4 -3
  78. package/dist/utils/scoringWorkout/scoringWorkout.integration.test.js +223 -185
  79. package/dist/utils/scoringWorkout/types.d.ts +34 -14
  80. package/package.json +31 -31
  81. package/dist/utils/exerciseRecord/__mocks__/exercises.mock.d.ts +0 -30
  82. package/dist/utils/exerciseRecord/__mocks__/exercises.mock.js +0 -138
  83. package/dist/utils/scaleProPlan.util.d.ts +0 -9
  84. package/dist/utils/scaleProPlan.util.js +0 -139
  85. package/dist/utils/scoring/calculateCalories.d.ts +0 -67
  86. package/dist/utils/scoring/calculateCalories.js +0 -345
  87. package/dist/utils/scoring/calculateMuscleFatiue.d.ts +0 -67
  88. package/dist/utils/scoring/calculateMuscleFatiue.js +0 -310
  89. package/dist/utils/scoring/calculateQualityScore.d.ts +0 -71
  90. package/dist/utils/scoring/calculateQualityScore.js +0 -334
  91. package/dist/utils/scoring/calculateTotalVolume.d.ts +0 -15
  92. package/dist/utils/scoring/calculateTotalVolume.js +0 -73
  93. package/dist/utils/scoring/constants.d.ts +0 -211
  94. package/dist/utils/scoring/constants.js +0 -247
  95. package/dist/utils/scoring/helpers.d.ts +0 -119
  96. package/dist/utils/scoring/helpers.js +0 -229
  97. package/dist/utils/scoring/index.d.ts +0 -28
  98. package/dist/utils/scoring/index.js +0 -47
  99. package/dist/utils/scoring/parseRecords.d.ts +0 -98
  100. package/dist/utils/scoring/parseRecords.js +0 -284
  101. package/dist/utils/scoring/types.d.ts +0 -86
  102. package/dist/utils/scoring/types.js +0 -11
  103. package/dist/utils/scoring.utils.d.ts +0 -14
  104. package/dist/utils/scoring.utils.js +0 -243
  105. /package/dist/utils/scoringWorkout/{calculateMuscleFatiue.d.ts → calculateMuscleFatigue.d.ts} +0 -0
  106. /package/dist/utils/scoringWorkout/{calculateMuscleFatiue.js → calculateMuscleFatigue.js} +0 -0
package/README.md CHANGED
@@ -1,149 +1,149 @@
1
- # @dgpholdings/greatoak-shared
2
-
3
- The shared library for the Fitfrix ecosystem. Contains all types, utilities, and the scoring engine used across:
4
-
5
- - `v2/fitfrix` — the mobile app (React Native / Expo)
6
- - `backend/api-service` — the NestJS backend
7
- - `fitfrix.com` — the web/landing (Vite + React)
8
-
9
- Any type, constant, or utility that is used by more than one package lives here. If you're about to define a type locally in a consuming app — check here first.
10
-
11
- ---
12
-
13
- ## Install / Import
14
-
15
- ```ts
16
- // Types
17
- import type { TExercise, TRecord, TUserMetric } from '@dgpholdings/greatoak-shared';
18
-
19
- // Utils
20
- import { calculateExerciseScoreV2, calculateTotalVolume, isDefined, toError } from '@dgpholdings/greatoak-shared';
21
- ```
22
-
23
- ---
24
-
25
- ## What's Inside
26
-
27
- | Category | Location | Doc |
28
- |---|---|---|
29
- | **Types** | `src/types/` | [docs/types.md](docs/types.md) |
30
- | **Utils** | `src/utils/` | [docs/utils.md](docs/utils.md) |
31
- | **Scoring Engine** | `src/utils/scoring/` | [docs/scoring.md](docs/scoring.md) |
32
-
33
- ---
34
-
35
- ## Types — Quick Reference
36
-
37
- | File | What it defines |
38
- |---|---|
39
- | `commonTypes.ts` | `TRecord`, `TExerciseConfig`, `TTemplateExercise`, `TGdprData`, `TDayKey` |
40
- | `TApiExercise.ts` | `TExercise`, `TBodyPart`, `EBodyParts`, `TTrainingType`, `TTimingGuardrails` |
41
- | `TApiUser.ts` | `TUserMetric`, `TFitnessGoal`, `TUserType`, `TSubscriptionStatus`, `TGender` |
42
- | `TApiAuth.ts` | Signup/signin request & response types (`TApiSignupAnonymousReq`, `TSignInRes`, etc.) |
43
- | `TApiExerciseRecord.ts` | Record save/fetch request & response types |
44
- | `TApiTemplateData.ts` | `TTemplate`, `TTemplateDb`, `TTemplateData`, `TExerciseLatestRecord` |
45
- | `TApiProPlan.ts` | `TProPlan`, pro plan CRUD request & response types |
46
- | `TApiTemplateShop.ts` | `TTemplateShopDb`, shop CRUD & shared plan types |
47
- | `TApiBillingPlan.ts` | `TBillingPlan`, `TBillingCountries`, billing API types |
48
- | `TApiRevenueCat.ts` | `TApiRevenueCatWebhookReq`, RevenueCat event types |
49
- | `TApiClientProgress.ts` | `TClientWorkoutHistory`, trainer dashboard types |
50
-
51
- ---
52
-
53
- ## Utils — Quick Reference
54
-
55
- | Export | What it does |
56
- |---|---|
57
- | `calculateExerciseScoreV2` | Full exercise scoring → `{ score, muscleScores }` |
58
- | `calculateTotalVolume` | Total workout volume for charts |
59
- | `isDefined` / `isDefinedNumber` | Null/undefined type guards |
60
- | `toError` | Converts unknown catch values to `Error` |
61
- | `toNumber` | Safe string/number → `number \| undefined` |
62
- | `mmssToSecs` | `"MM:SS"` → seconds |
63
- | `getDaysAndHoursDifference` | Date diff → `{ days, hours }` |
64
- | `isUserAllowedToUpdate` | Profile update rate-limit guard |
65
- | `countryToCurrencyCode` | Country code → ISO currency string |
66
- | `slugifyText` | Text → URL-safe slug |
67
- | `generatePlanCode` | Generates a unique 9-char Crockford Base32 plan code |
68
- | `maskEmail` / `isEmail` / `isAnonymousEmail` | Email utilities |
69
- | `NOOP` | Empty function `() => {}` |
70
-
71
- ---
72
-
73
- ## Source Structure
74
-
75
- ```
76
- shared/
77
- ├── src/
78
- │ ├── types/
79
- │ │ ├── index.ts # Re-exports all types
80
- │ │ ├── commonTypes.ts # TRecord, TExerciseConfig, TTemplateExercise, TGdprData, TDayKey
81
- │ │ ├── TApiExercise.ts # TExercise and related
82
- │ │ ├── TApiUser.ts # TUserMetric and related
83
- │ │ ├── TApiAuth.ts # Auth flows
84
- │ │ ├── TApiExerciseRecord.ts # Workout record save/fetch
85
- │ │ ├── TApiTemplateData.ts # User workout templates
86
- │ │ ├── TApiProPlan.ts # Pro/trainer plans
87
- │ │ ├── TApiTemplateShop.ts # Template shop (legacy, see TApiProPlan)
88
- │ │ ├── TApiBillingPlan.ts # Billing plans
89
- │ │ ├── TApiRevenueCat.ts # In-app purchase webhooks
90
- │ │ └── TApiClientProgress.ts # Trainer client tracking
91
- │ └── utils/
92
- │ ├── index.ts # Re-exports all utils
93
- │ ├── billing.utils.ts
94
- │ ├── email.utils.ts
95
- │ ├── isDefined.utils.ts
96
- │ ├── noop.utils.ts
97
- │ ├── number.util.ts
98
- │ ├── planCode.util.ts
99
- │ ├── slugify.util.ts
100
- │ ├── time.util.ts
101
- │ ├── toError.util.ts
102
- │ └── scoring/ # Exercise scoring engine
103
- │ └── README.md # Full scoring documentation
104
- ├── docs/
105
- │ ├── types.md # All types documented in detail
106
- │ ├── utils.md # All utils documented with examples
107
- │ └── scoring.md # Scoring system overview
108
- └── README.md # This file
109
- ```
110
-
111
- ---
112
-
113
- ## Key Design Rules
114
-
115
- - **No local duplication** — if a type or utility is needed by ≥2 packages, it belongs here
116
- - **No framework code** — this package must stay framework-agnostic (no React, no NestJS decorators)
117
- - **Strict types** — no `any`. Use generics, discriminated unions, or `unknown`
118
- - **Scoring is the business core** — the scoring engine drives the muscle fatigue diagram and progress charts. Read [docs/scoring.md](docs/scoring.md) before touching it
119
-
120
-
121
- ## Renewing token
122
-
123
- 1. Login using the token (recommended way)
124
-
125
- In your Git Bash, run:
126
-
127
- `npm login`
128
-
129
- It will prompt:
130
-
131
- Username:
132
- Password:
133
- Email:
134
-
135
- Use this:
136
-
137
- Username → your npm username
138
-
139
- Password → paste the granular token (NOT your npm password)
140
-
141
- Email → your npm email
142
-
143
- After that, npm stores the token in:
144
-
145
- `shared\.npmrc`
146
-
147
- Then publishing works normally:
148
-
1
+ # @dgpholdings/greatoak-shared
2
+
3
+ The shared library for the Fitfrix ecosystem. Contains all types, utilities, and the scoring engine used across:
4
+
5
+ - `v2/fitfrix` — the mobile app (React Native / Expo)
6
+ - `backend/api-service` — the NestJS backend
7
+ - `fitfrix.com` — the web/landing (Vite + React)
8
+
9
+ Any type, constant, or utility that is used by more than one package lives here. If you're about to define a type locally in a consuming app — check here first.
10
+
11
+ ---
12
+
13
+ ## Install / Import
14
+
15
+ ```ts
16
+ // Types
17
+ import type { TExercise, TRecord, TUserMetric } from '@dgpholdings/greatoak-shared';
18
+
19
+ // Utils
20
+ import { calculateExerciseScoreV2, calculateTotalVolume, isDefined, toError } from '@dgpholdings/greatoak-shared';
21
+ ```
22
+
23
+ ---
24
+
25
+ ## What's Inside
26
+
27
+ | Category | Location | Doc |
28
+ |---|---|---|
29
+ | **Types** | `src/types/` | [docs/types.md](docs/types.md) |
30
+ | **Utils** | `src/utils/` | [docs/utils.md](docs/utils.md) |
31
+ | **Scoring Engine** | `src/utils/scoring/` | [docs/scoring.md](docs/scoring.md) |
32
+
33
+ ---
34
+
35
+ ## Types — Quick Reference
36
+
37
+ | File | What it defines |
38
+ |---|---|
39
+ | `commonTypes.ts` | `TRecord`, `TExerciseConfig`, `TTemplateExercise`, `TGdprData`, `TDayKey` |
40
+ | `TApiExercise.ts` | `TExercise`, `TBodyPart`, `EBodyParts`, `TTrainingType`, `TTimingGuardrails` |
41
+ | `TApiUser.ts` | `TUserMetric`, `TFitnessGoal`, `TUserType`, `TSubscriptionStatus`, `TGender` |
42
+ | `TApiAuth.ts` | Signup/signin request & response types (`TApiSignupAnonymousReq`, `TSignInRes`, etc.) |
43
+ | `TApiExerciseRecord.ts` | Record save/fetch request & response types |
44
+ | `TApiTemplateData.ts` | `TTemplate`, `TTemplateDb`, `TTemplateData`, `TExerciseLatestRecord` |
45
+ | `TApiProPlan.ts` | `TProPlan`, pro plan CRUD request & response types |
46
+ | `TApiTemplateShop.ts` | `TTemplateShopDb`, shop CRUD & shared plan types |
47
+ | `TApiBillingPlan.ts` | `TBillingPlan`, `TBillingCountries`, billing API types |
48
+ | `TApiRevenueCat.ts` | `TApiRevenueCatWebhookReq`, RevenueCat event types |
49
+ | `TApiClientProgress.ts` | `TClientWorkoutHistory`, trainer dashboard types |
50
+
51
+ ---
52
+
53
+ ## Utils — Quick Reference
54
+
55
+ | Export | What it does |
56
+ |---|---|
57
+ | `calculateExerciseScoreV2` | Full exercise scoring → `{ score, muscleScores }` |
58
+ | `calculateTotalVolume` | Total workout volume for charts |
59
+ | `isDefined` / `isDefinedNumber` | Null/undefined type guards |
60
+ | `toError` | Converts unknown catch values to `Error` |
61
+ | `toNumber` | Safe string/number → `number \| undefined` |
62
+ | `mmssToSecs` | `"MM:SS"` → seconds |
63
+ | `getDaysAndHoursDifference` | Date diff → `{ days, hours }` |
64
+ | `isUserAllowedToUpdate` | Profile update rate-limit guard |
65
+ | `countryToCurrencyCode` | Country code → ISO currency string |
66
+ | `slugifyText` | Text → URL-safe slug |
67
+ | `generatePlanCode` | Generates a unique 9-char Crockford Base32 plan code |
68
+ | `maskEmail` / `isEmail` / `isAnonymousEmail` | Email utilities |
69
+ | `NOOP` | Empty function `() => {}` |
70
+
71
+ ---
72
+
73
+ ## Source Structure
74
+
75
+ ```
76
+ shared/
77
+ ├── src/
78
+ │ ├── types/
79
+ │ │ ├── index.ts # Re-exports all types
80
+ │ │ ├── commonTypes.ts # TRecord, TExerciseConfig, TTemplateExercise, TGdprData, TDayKey
81
+ │ │ ├── TApiExercise.ts # TExercise and related
82
+ │ │ ├── TApiUser.ts # TUserMetric and related
83
+ │ │ ├── TApiAuth.ts # Auth flows
84
+ │ │ ├── TApiExerciseRecord.ts # Workout record save/fetch
85
+ │ │ ├── TApiTemplateData.ts # User workout templates
86
+ │ │ ├── TApiProPlan.ts # Pro/trainer plans
87
+ │ │ ├── TApiTemplateShop.ts # Template shop (legacy, see TApiProPlan)
88
+ │ │ ├── TApiBillingPlan.ts # Billing plans
89
+ │ │ ├── TApiRevenueCat.ts # In-app purchase webhooks
90
+ │ │ └── TApiClientProgress.ts # Trainer client tracking
91
+ │ └── utils/
92
+ │ ├── index.ts # Re-exports all utils
93
+ │ ├── billing.utils.ts
94
+ │ ├── email.utils.ts
95
+ │ ├── isDefined.utils.ts
96
+ │ ├── noop.utils.ts
97
+ │ ├── number.util.ts
98
+ │ ├── planCode.util.ts
99
+ │ ├── slugify.util.ts
100
+ │ ├── time.util.ts
101
+ │ ├── toError.util.ts
102
+ │ └── scoring/ # Exercise scoring engine
103
+ │ └── README.md # Full scoring documentation
104
+ ├── docs/
105
+ │ ├── types.md # All types documented in detail
106
+ │ ├── utils.md # All utils documented with examples
107
+ │ └── scoring.md # Scoring system overview
108
+ └── README.md # This file
109
+ ```
110
+
111
+ ---
112
+
113
+ ## Key Design Rules
114
+
115
+ - **No local duplication** — if a type or utility is needed by ≥2 packages, it belongs here
116
+ - **No framework code** — this package must stay framework-agnostic (no React, no NestJS decorators)
117
+ - **Strict types** — no `any`. Use generics, discriminated unions, or `unknown`
118
+ - **Scoring is the business core** — the scoring engine drives the muscle fatigue diagram and progress charts. Read [docs/scoring.md](docs/scoring.md) before touching it
119
+
120
+
121
+ ## Renewing token
122
+
123
+ 1. Login using the token (recommended way)
124
+
125
+ In your Git Bash, run:
126
+
127
+ `npm login`
128
+
129
+ It will prompt:
130
+
131
+ Username:
132
+ Password:
133
+ Email:
134
+
135
+ Use this:
136
+
137
+ Username → your npm username
138
+
139
+ Password → paste the granular token (NOT your npm password)
140
+
141
+ Email → your npm email
142
+
143
+ After that, npm stores the token in:
144
+
145
+ `shared\.npmrc`
146
+
147
+ Then publishing works normally:
148
+
149
149
  `npm publish`
@@ -0,0 +1,2 @@
1
+ import { TExercise } from "../types";
2
+ export declare const testCatalog: Record<string, TExercise>;
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.testCatalog = void 0;
4
+ exports.testCatalog = {
5
+ "-SR_ogujWtdkH6EtCe2OQ": {
6
+ exerciseId: "-SR_ogujWtdkH6EtCe2OQ",
7
+ name: "Diamond Push Up",
8
+ primaryMuscles: ["tricep-brachii-long", "tricep-brachii-lateral"],
9
+ secondaryMuscles: [
10
+ "pectoralis-major",
11
+ "pectoralis-minor",
12
+ "deltoids-anterior",
13
+ "serratus-anterior",
14
+ "abs-upper",
15
+ ],
16
+ difficultyLevel: 3,
17
+ movementPattern: "push_horizontal",
18
+ exerciseType: "bodyweight",
19
+ isUnilateral: false,
20
+ bodyweightDependency: null,
21
+ weightMultiplier: null,
22
+ status: "active",
23
+ },
24
+ "2tprDDd4_BsnK6gbMVWTQ": {
25
+ exerciseId: "2tprDDd4_BsnK6gbMVWTQ",
26
+ name: "Arm Circles Backward",
27
+ primaryMuscles: ["deltoids-middle", "deltoids-anterior"],
28
+ secondaryMuscles: ["trapezius", "rhomboids", "serratus-anterior"],
29
+ difficultyLevel: 1,
30
+ movementPattern: "mobility",
31
+ exerciseType: "mobility",
32
+ isUnilateral: false,
33
+ bodyweightDependency: null,
34
+ weightMultiplier: null,
35
+ status: "active",
36
+ },
37
+ "3CkW5o5VQbCodRFmByeMc": {
38
+ exerciseId: "3CkW5o5VQbCodRFmByeMc",
39
+ name: "Jump Squats",
40
+ primaryMuscles: ["quadriceps", "glutes-maximus", "calves"],
41
+ secondaryMuscles: ["hamstrings", "abs-lower", "hip-flexors"],
42
+ difficultyLevel: 3,
43
+ movementPattern: "plyo",
44
+ exerciseType: "plyometric",
45
+ isUnilateral: false,
46
+ bodyweightDependency: "high",
47
+ weightMultiplier: null,
48
+ status: "active",
49
+ },
50
+ "5LyI0el3TUJta6xLYdoua": {
51
+ exerciseId: "5LyI0el3TUJta6xLYdoua",
52
+ name: "Arnold Press",
53
+ primaryMuscles: ["deltoids-anterior", "deltoids-middle"],
54
+ secondaryMuscles: [
55
+ "deltoids-anterior",
56
+ "tricep-brachii-long",
57
+ "serratus-anterior",
58
+ ],
59
+ difficultyLevel: 3,
60
+ movementPattern: "push_vertical",
61
+ exerciseType: "compound",
62
+ isUnilateral: false,
63
+ bodyweightDependency: null,
64
+ weightMultiplier: null,
65
+ status: "active",
66
+ },
67
+ "9W7Yon0FWh1Eqd52yjHV9": {
68
+ exerciseId: "9W7Yon0FWh1Eqd52yjHV9",
69
+ name: "Child Pose",
70
+ primaryMuscles: ["lower-back", "latissimus-dorsi"],
71
+ secondaryMuscles: ["deltoids-middle", "rhomboids", "abs-upper"],
72
+ difficultyLevel: 0,
73
+ movementPattern: "mobility",
74
+ exerciseType: "mobility",
75
+ isUnilateral: false,
76
+ bodyweightDependency: null,
77
+ weightMultiplier: null,
78
+ status: "active",
79
+ },
80
+ "D3XVV-ypHfraYO52eH9ur": {
81
+ exerciseId: "D3XVV-ypHfraYO52eH9ur",
82
+ name: "Bulgarian Split Squat",
83
+ primaryMuscles: ["quadriceps", "glutes-maximus"],
84
+ secondaryMuscles: ["hamstrings", "glutes-medius", "calves", "abs-lower"],
85
+ difficultyLevel: 2,
86
+ movementPattern: "lunge",
87
+ exerciseType: "bodyweight",
88
+ isUnilateral: false,
89
+ bodyweightDependency: "high",
90
+ weightMultiplier: null,
91
+ status: "active",
92
+ },
93
+ EA9B8p_H60pQPRBevjRj6: {
94
+ exerciseId: "EA9B8p_H60pQPRBevjRj6",
95
+ name: "Close Grip Push Up",
96
+ primaryMuscles: ["tricep-brachii-long", "tricep-brachii-lateral"],
97
+ secondaryMuscles: [
98
+ "pectoralis-major",
99
+ "pectoralis-minor",
100
+ "deltoids-anterior",
101
+ "serratus-anterior",
102
+ "abs-upper",
103
+ ],
104
+ difficultyLevel: 3,
105
+ movementPattern: "push_horizontal",
106
+ exerciseType: "bodyweight",
107
+ isUnilateral: false,
108
+ bodyweightDependency: "high",
109
+ weightMultiplier: null,
110
+ status: "active",
111
+ },
112
+ RQCNQi0sw8icSqyhzytyS: {
113
+ exerciseId: "RQCNQi0sw8icSqyhzytyS",
114
+ name: "Machine Fly (Pec Deck)",
115
+ primaryMuscles: ["pectoralis-major", "pectoralis-minor"],
116
+ secondaryMuscles: ["deltoids-anterior", "serratus-anterior"],
117
+ difficultyLevel: 1,
118
+ movementPattern: "push_horizontal",
119
+ exerciseType: "isolation",
120
+ isUnilateral: false,
121
+ bodyweightDependency: "none",
122
+ weightMultiplier: {
123
+ female: 0.18,
124
+ male: 0.3,
125
+ default: 0.24,
126
+ },
127
+ status: "active",
128
+ },
129
+ "S7Edj-DnCvOgYNv_0SlzP": {
130
+ exerciseId: "S7Edj-DnCvOgYNv_0SlzP",
131
+ name: "Plank Up-Downs",
132
+ primaryMuscles: ["abs-upper", "abs-lower"],
133
+ secondaryMuscles: [
134
+ "deltoids-anterior",
135
+ "tricep-brachii-long",
136
+ "obliques",
137
+ "serratus-anterior",
138
+ ],
139
+ difficultyLevel: 3,
140
+ movementPattern: "core_stability",
141
+ exerciseType: "bodyweight",
142
+ isUnilateral: false,
143
+ bodyweightDependency: null,
144
+ weightMultiplier: null,
145
+ status: "active",
146
+ },
147
+ _pz6syBDTeH36DFmg2VRy: {
148
+ exerciseId: "_pz6syBDTeH36DFmg2VRy",
149
+ name: "Treadmill Running",
150
+ primaryMuscles: ["quadriceps", "hamstrings", "calf-inner", "calf-outer"],
151
+ secondaryMuscles: [
152
+ "maximus-lower",
153
+ "medius-upper",
154
+ "abs-upper",
155
+ "abs-lower",
156
+ ],
157
+ difficultyLevel: 1,
158
+ movementPattern: "cardio",
159
+ exerciseType: "cardio",
160
+ isUnilateral: false,
161
+ bodyweightDependency: "high",
162
+ weightMultiplier: null,
163
+ status: "active",
164
+ },
165
+ cICiD8ldTl3TVKl_SZV4y: {
166
+ exerciseId: "cICiD8ldTl3TVKl_SZV4y",
167
+ name: "Tricep Extension Machine",
168
+ primaryMuscles: ["tricep-brachii-long", "tricep-brachii-lateral"],
169
+ secondaryMuscles: ["fore-arm-inner"],
170
+ difficultyLevel: 1,
171
+ movementPattern: "push_horizontal",
172
+ exerciseType: "isolation",
173
+ isUnilateral: false,
174
+ bodyweightDependency: "none",
175
+ weightMultiplier: {
176
+ female: 0.15,
177
+ male: 0.25,
178
+ default: 0.2,
179
+ },
180
+ status: "active",
181
+ },
182
+ cXExEzqEAF8YrFN2kAnIq: {
183
+ exerciseId: "cXExEzqEAF8YrFN2kAnIq",
184
+ name: "Alternating Lunges with Pause",
185
+ primaryMuscles: ["quadriceps", "glutes-maximus"],
186
+ secondaryMuscles: ["hamstrings", "calves", "glutes-medius", "abs-lower"],
187
+ difficultyLevel: 2,
188
+ movementPattern: "lunge",
189
+ exerciseType: "bodyweight",
190
+ isUnilateral: false,
191
+ bodyweightDependency: "high",
192
+ weightMultiplier: null,
193
+ status: "active",
194
+ },
195
+ "xNvol6-lFnHQUMCfxFMBD": {
196
+ exerciseId: "xNvol6-lFnHQUMCfxFMBD",
197
+ name: "Bodyweight Squat",
198
+ primaryMuscles: ["quadriceps", "glutes-maximus"],
199
+ secondaryMuscles: ["hamstrings", "calves", "abs-lower"],
200
+ difficultyLevel: 1,
201
+ movementPattern: "squat",
202
+ exerciseType: "bodyweight",
203
+ isUnilateral: false,
204
+ bodyweightDependency: null,
205
+ weightMultiplier: null,
206
+ status: "active",
207
+ },
208
+ };
@@ -5,31 +5,24 @@ import { TExercise } from "../types";
5
5
  */
6
6
  export declare const mockExerciseWeightReps: TExercise;
7
7
  /**
8
- * MOCK EXERCISE: Reps-Only
9
- * Simulates a bodyweight movement (e.g., Push-up).
8
+ * MOCK EXERCISE: Reps-Only (bodyweight push)
10
9
  */
11
10
  export declare const mockExerciseRepsOnly: TExercise;
12
11
  /**
13
- * MOCK EXERCISE: Duration
14
- * Simulates an isometric hold (e.g., Plank).
12
+ * MOCK EXERCISE: Duration (isometric hold)
15
13
  */
16
14
  export declare const mockExerciseDuration: TExercise;
17
15
  /**
18
16
  * MOCK EXERCISE: Cardio-Machine
19
- * Simulates a machine cardio session (e.g., Treadmill).
20
17
  */
21
18
  export declare const mockExerciseCardioMachine: TExercise;
22
19
  /**
23
20
  * MOCK EXERCISE: Cardio-Free
24
- * Simulates an outdoor/untracked cardio session (e.g., Outdoor Run).
25
21
  */
26
22
  export declare const mockExerciseCardioFree: TExercise;
27
23
  /**
28
- * MOCK EXERCISE: No Guardrails
29
- * Simulates an older DB entry or custom exercise missing guardrails.
24
+ * MOCK EXERCISE: No Guardrails (legacy/custom entry)
30
25
  */
31
26
  export declare const mockExerciseNoGuardrails: TExercise;
32
- /**
33
- * Helper dictionary containing all mock exercises mapped by their ID.
34
- */
27
+ /** All mock exercises mapped by id. */
35
28
  export declare const mockExercisesDictionary: Record<string, TExercise>;