@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.
- package/README.md +148 -148
- package/dist/__mocks__/catalog.fixture.d.ts +2 -0
- package/dist/__mocks__/catalog.fixture.js +208 -0
- package/dist/__mocks__/exercises.mock.d.ts +4 -11
- package/dist/__mocks__/exercises.mock.js +82 -41
- package/dist/__mocks__/sessions.mock.d.ts +28 -0
- package/dist/__mocks__/sessions.mock.js +394 -0
- package/dist/__mocks__/testIds.d.ts +9 -0
- package/dist/__mocks__/testIds.js +13 -0
- package/dist/__mocks__/user.mock.js +3 -1
- package/dist/constants/goalJourney.d.ts +108 -0
- package/dist/constants/goalJourney.js +443 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +1 -0
- package/dist/types/TApiAiExerciseAnalysis.d.ts +2 -1
- package/dist/types/TApiClientConstellation.d.ts +33 -0
- package/dist/types/TApiClientConstellation.js +13 -0
- package/dist/types/TApiExercise.d.ts +5 -3
- package/dist/types/TApiUser.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/utils/adoptionEngine/scaleProPlan.util.js +9 -4
- package/dist/utils/constellation/computeNormalisedLoad.d.ts +48 -0
- package/dist/utils/constellation/computeNormalisedLoad.js +150 -0
- package/dist/utils/constellation/computeNormalisedLoad.test.d.ts +1 -0
- package/dist/utils/constellation/computeNormalisedLoad.test.js +218 -0
- package/dist/utils/constellation/evaluateConstellation.d.ts +27 -0
- package/dist/utils/constellation/evaluateConstellation.js +135 -0
- package/dist/utils/constellation/evaluateConstellation.test.d.ts +1 -0
- package/dist/utils/constellation/evaluateConstellation.test.js +93 -0
- package/dist/utils/constellation/index.d.ts +18 -0
- package/dist/utils/constellation/index.js +29 -0
- package/dist/utils/constellation/levelThresholds.d.ts +99 -0
- package/dist/utils/constellation/levelThresholds.js +123 -0
- package/dist/utils/constellation/starFoundation.d.ts +25 -0
- package/dist/utils/constellation/starFoundation.js +54 -0
- package/dist/utils/constellation/starFoundation.test.d.ts +1 -0
- package/dist/utils/constellation/starFoundation.test.js +75 -0
- package/dist/utils/constellation/stars/consistency.d.ts +29 -0
- package/dist/utils/constellation/stars/consistency.js +142 -0
- package/dist/utils/constellation/stars/consistency.test.d.ts +1 -0
- package/dist/utils/constellation/stars/consistency.test.js +94 -0
- package/dist/utils/constellation/stars/lowerBody.d.ts +17 -0
- package/dist/utils/constellation/stars/lowerBody.js +30 -0
- package/dist/utils/constellation/stars/pull.d.ts +11 -0
- package/dist/utils/constellation/stars/pull.js +24 -0
- package/dist/utils/constellation/stars/push.d.ts +11 -0
- package/dist/utils/constellation/stars/push.js +24 -0
- package/dist/utils/constellation/stars/quality.d.ts +19 -0
- package/dist/utils/constellation/stars/quality.js +98 -0
- package/dist/utils/constellation/stars/quality.test.d.ts +1 -0
- package/dist/utils/constellation/stars/quality.test.js +113 -0
- package/dist/utils/constellation/stars/recovery.d.ts +29 -0
- package/dist/utils/constellation/stars/recovery.js +169 -0
- package/dist/utils/constellation/stars/recovery.test.d.ts +1 -0
- package/dist/utils/constellation/stars/recovery.test.js +131 -0
- package/dist/utils/constellation/strengthStar.test.d.ts +1 -0
- package/dist/utils/constellation/strengthStar.test.js +190 -0
- package/dist/utils/constellation/strengthStarHelpers.d.ts +41 -0
- package/dist/utils/constellation/strengthStarHelpers.js +104 -0
- package/dist/utils/constellation/types.d.ts +124 -0
- package/dist/utils/constellation/types.js +18 -0
- package/dist/utils/exerciseRecord/recordValidator.integration.test.js +1 -1
- package/dist/utils/exerciseRecord/recordValidator.js +1 -1
- package/dist/utils/exerciseRecord/recordValidator.test.js +8 -8
- package/dist/utils/index.d.ts +5 -3
- package/dist/utils/index.js +1 -0
- package/dist/utils/scoringWorkout/calculateQualityScore.d.ts +59 -36
- package/dist/utils/scoringWorkout/calculateQualityScore.js +234 -233
- package/dist/utils/scoringWorkout/computeMuscleFatigueMap.d.ts +8 -5
- package/dist/utils/scoringWorkout/computeMuscleFatigueMap.js +72 -88
- package/dist/utils/scoringWorkout/constants.d.ts +20 -6
- package/dist/utils/scoringWorkout/constants.js +23 -9
- package/dist/utils/scoringWorkout/helpers.d.ts +7 -0
- package/dist/utils/scoringWorkout/helpers.js +24 -18
- package/dist/utils/scoringWorkout/index.d.ts +12 -8
- package/dist/utils/scoringWorkout/index.js +23 -15
- package/dist/utils/scoringWorkout/parseRecords.js +4 -3
- package/dist/utils/scoringWorkout/scoringWorkout.integration.test.js +223 -185
- package/dist/utils/scoringWorkout/types.d.ts +34 -14
- package/package.json +31 -31
- package/dist/utils/exerciseRecord/__mocks__/exercises.mock.d.ts +0 -30
- package/dist/utils/exerciseRecord/__mocks__/exercises.mock.js +0 -138
- package/dist/utils/scaleProPlan.util.d.ts +0 -9
- package/dist/utils/scaleProPlan.util.js +0 -139
- package/dist/utils/scoring/calculateCalories.d.ts +0 -67
- package/dist/utils/scoring/calculateCalories.js +0 -345
- package/dist/utils/scoring/calculateMuscleFatiue.d.ts +0 -67
- package/dist/utils/scoring/calculateMuscleFatiue.js +0 -310
- package/dist/utils/scoring/calculateQualityScore.d.ts +0 -71
- package/dist/utils/scoring/calculateQualityScore.js +0 -334
- package/dist/utils/scoring/calculateTotalVolume.d.ts +0 -15
- package/dist/utils/scoring/calculateTotalVolume.js +0 -73
- package/dist/utils/scoring/constants.d.ts +0 -211
- package/dist/utils/scoring/constants.js +0 -247
- package/dist/utils/scoring/helpers.d.ts +0 -119
- package/dist/utils/scoring/helpers.js +0 -229
- package/dist/utils/scoring/index.d.ts +0 -28
- package/dist/utils/scoring/index.js +0 -47
- package/dist/utils/scoring/parseRecords.d.ts +0 -98
- package/dist/utils/scoring/parseRecords.js +0 -284
- package/dist/utils/scoring/types.d.ts +0 -86
- package/dist/utils/scoring/types.js +0 -11
- package/dist/utils/scoring.utils.d.ts +0 -14
- package/dist/utils/scoring.utils.js +0 -243
- /package/dist/utils/scoringWorkout/{calculateMuscleFatiue.d.ts → calculateMuscleFatigue.d.ts} +0 -0
- /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,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>;
|