@dofek/training 0.1.7 → 0.1.8

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 CHANGED
@@ -49,7 +49,7 @@ Every public module is imported as `@dofek/training/<subpath>`.
49
49
  | Subpath | Purpose |
50
50
  | --- | --- |
51
51
  | `activity-icons` | Normalize activity names into framework-neutral icon categories |
52
- | `climbing-grades` | Parse V-scale and Yosemite Decimal System climbing grades |
52
+ | `climbing-grades` | Validate, order, and convert Sandbag-supported boulder and route climbing grades |
53
53
  | `derived-cardio` | Cycling and submaximal walking/running VO2 max estimates and validation |
54
54
  | `endurance-types` | Endurance and indoor-cycling type guards |
55
55
  | `grade-adjusted-pace` | Grade cost factor and adjusted running pace |
@@ -1,8 +1,54 @@
1
- export type ClimbingGradeSystem = "v_scale" | "yds";
1
+ import { z } from "zod";
2
+ export declare const CLIMBING_GRADE_SYSTEMS: readonly ["v_scale", "font", "yds", "french", "uiaa", "ewbank", "saxon", "norwegian", "brazilian_crux"];
3
+ export type ClimbingGradeSystem = (typeof CLIMBING_GRADE_SYSTEMS)[number];
4
+ export type BoulderGradeSystem = "v_scale" | "font";
5
+ export type RouteGradeSystem = Exclude<ClimbingGradeSystem, BoulderGradeSystem>;
6
+ export type ClimbingClimbType = "boulder" | "route";
7
+ export interface ClimbingGradePreference {
8
+ boulder: BoulderGradeSystem;
9
+ route: RouteGradeSystem;
10
+ }
2
11
  export interface ParsedClimbingGrade {
3
- gradeSystem: ClimbingGradeSystem;
12
+ gradeSystem: "v_scale" | "yds";
4
13
  grade: string;
5
14
  sortValue: number;
6
15
  }
16
+ export interface ConvertedClimbingGrade {
17
+ displayGrade: string;
18
+ displaySystem: ClimbingGradeSystem;
19
+ sortValue: number;
20
+ }
21
+ export declare const DEFAULT_CLIMBING_GRADE_PREFERENCE: ClimbingGradePreference;
22
+ export declare const BOULDER_GRADE_SYSTEMS: readonly ["v_scale", "font"];
23
+ export declare const ROUTE_GRADE_SYSTEMS: readonly ["yds", "french", "uiaa", "ewbank", "saxon", "norwegian", "brazilian_crux"];
24
+ export declare const climbingGradePreferenceSchema: z.ZodObject<{
25
+ boulder: z.ZodEnum<{
26
+ v_scale: "v_scale";
27
+ font: "font";
28
+ }>;
29
+ route: z.ZodEnum<{
30
+ yds: "yds";
31
+ french: "french";
32
+ uiaa: "uiaa";
33
+ ewbank: "ewbank";
34
+ saxon: "saxon";
35
+ norwegian: "norwegian";
36
+ brazilian_crux: "brazilian_crux";
37
+ }>;
38
+ }, z.core.$strip>;
39
+ export declare function gradeSystemsForClimbType(climbType: "boulder"): readonly BoulderGradeSystem[];
40
+ export declare function gradeSystemsForClimbType(climbType: "route"): readonly RouteGradeSystem[];
41
+ export declare function gradeSystemsForClimbType(climbType: ClimbingClimbType): readonly ClimbingGradeSystem[];
42
+ export declare function resolveClimbingGradePreference(value: unknown): ClimbingGradePreference;
43
+ export declare function gradeOptionsForSystem(system: ClimbingGradeSystem): readonly string[];
44
+ export declare function gradeSystemLabel(system: ClimbingGradeSystem): string;
45
+ export declare function isGradeSystemForClimbType(system: ClimbingGradeSystem, climbType: ClimbingClimbType): boolean;
46
+ export declare function isValidClimbingGrade(grade: string, system: ClimbingGradeSystem): boolean;
47
+ export declare function gradeSortValue(grade: string, system: ClimbingGradeSystem): number | null;
48
+ export declare function convertClimbingGrade(input: {
49
+ grade: string;
50
+ sourceSystem: ClimbingGradeSystem;
51
+ displaySystem: ClimbingGradeSystem;
52
+ }): ConvertedClimbingGrade | null;
7
53
  export declare function parseClimbingGrade(input: string): ParsedClimbingGrade | null;
8
54
  //# sourceMappingURL=climbing-grades.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"climbing-grades.d.ts","sourceRoot":"","sources":["../src/climbing-grades.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,mBAAmB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAsGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAE5E"}
1
+ {"version":3,"file":"climbing-grades.d.ts","sourceRoot":"","sources":["../src/climbing-grades.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB,yGAUzB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1E,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAAC;AACpD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;AAChF,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,SAAS,GAAG,KAAK,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,mBAAmB,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,iCAAiC,EAAE,uBAG/C,CAAC;AA0BF,eAAO,MAAM,qBAAqB,8BAGgB,CAAC;AACnD,eAAO,MAAM,mBAAmB,sFAQgB,CAAC;AAEjD,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;iBAGxC,CAAC;AA4BH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,kBAAkB,EAAE,CAAC;AAC9F,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,gBAAgB,EAAE,CAAC;AAC1F,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,iBAAiB,GAC3B,SAAS,mBAAmB,EAAE,CAAC;AAOlC,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAGtF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,SAAS,MAAM,EAAE,CAEpF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAEpE;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAIT;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAExF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,CAOxF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,mBAAmB,CAAC;CACpC,GAAG,sBAAsB,GAAG,IAAI,CAoBhC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAO5E"}
@@ -1,80 +1,145 @@
1
- const vScalePattern = /^V(?<grade>B|0|[1-9]\d*)$/i;
2
- const yosemiteDecimalSystemPattern = /^5\.(?<majorGrade>\d{1,2})(?<modifier>[ABCD]|[+-])?$/i;
3
- const yosemiteLetterSortOffsets = new Map([
4
- ["a", 1],
5
- ["b", 2],
6
- ["c", 3],
7
- ["d", 4],
8
- ]);
9
- class ClimbingGradeParser {
10
- parse(input) {
11
- const trimmedInput = input.trim();
12
- return (this.#parseVScaleGrade(trimmedInput) ?? this.#parseYosemiteDecimalSystemGrade(trimmedInput));
13
- }
14
- #parseVScaleGrade(input) {
15
- const match = vScalePattern.exec(input);
16
- const matchedGrade = match?.groups?.grade;
17
- if (!matchedGrade) {
18
- return null;
19
- }
20
- if (matchedGrade.toUpperCase() === "B") {
21
- return {
22
- gradeSystem: "v_scale",
23
- grade: "VB",
24
- sortValue: -1,
25
- };
26
- }
27
- const sortValue = Number.parseInt(matchedGrade, 10);
28
- if (!Number.isSafeInteger(sortValue)) {
29
- return null;
30
- }
31
- return {
32
- gradeSystem: "v_scale",
33
- grade: `V${sortValue}`,
34
- sortValue,
35
- };
36
- }
37
- #parseYosemiteDecimalSystemGrade(input) {
38
- const match = yosemiteDecimalSystemPattern.exec(input);
39
- const matchedMajorGrade = match?.groups?.majorGrade;
40
- if (!matchedMajorGrade) {
41
- return null;
42
- }
43
- const majorGrade = Number.parseInt(matchedMajorGrade, 10);
44
- if (!Number.isInteger(majorGrade) || majorGrade < 0 || majorGrade > 15) {
45
- return null;
46
- }
47
- const modifier = match.groups?.modifier?.toLowerCase();
48
- const sortValue = this.#computeYosemiteDecimalSystemSortValue(majorGrade, modifier);
49
- if (sortValue === null) {
50
- return null;
51
- }
52
- return {
53
- gradeSystem: "yds",
54
- grade: `5.${majorGrade}${modifier ?? ""}`,
55
- sortValue,
56
- };
57
- }
58
- #computeYosemiteDecimalSystemSortValue(majorGrade, modifier) {
59
- const baseSortValue = 5000 + majorGrade * 10;
60
- if (!modifier) {
61
- return baseSortValue;
62
- }
63
- if (modifier === "-") {
64
- return baseSortValue - 3;
65
- }
66
- if (modifier === "+") {
67
- return baseSortValue + 5;
68
- }
69
- const letterSortOffset = yosemiteLetterSortOffsets.get(modifier);
70
- if (letterSortOffset === undefined) {
71
- return null;
72
- }
73
- return baseSortValue + letterSortOffset;
74
- }
1
+ /// <reference path="./openbeta-sandbag.d.ts" />
2
+ import { convertGrade, GradeScales, getScale } from "@openbeta/sandbag";
3
+ import { z } from "zod";
4
+ export const CLIMBING_GRADE_SYSTEMS = [
5
+ "v_scale",
6
+ "font",
7
+ "yds",
8
+ "french",
9
+ "uiaa",
10
+ "ewbank",
11
+ "saxon",
12
+ "norwegian",
13
+ "brazilian_crux",
14
+ ];
15
+ export const DEFAULT_CLIMBING_GRADE_PREFERENCE = {
16
+ boulder: "v_scale",
17
+ route: "yds",
18
+ };
19
+ const systemToSandbagScale = {
20
+ v_scale: GradeScales.VSCALE,
21
+ font: GradeScales.FONT,
22
+ yds: GradeScales.YDS,
23
+ french: GradeScales.FRENCH,
24
+ uiaa: GradeScales.UIAA,
25
+ ewbank: GradeScales.EWBANK,
26
+ saxon: GradeScales.SAXON,
27
+ norwegian: GradeScales.NORWEGIAN,
28
+ brazilian_crux: GradeScales.BRAZILIAN_CRUX,
29
+ };
30
+ const SYSTEM_LABELS = {
31
+ v_scale: "V Scale",
32
+ font: "Fontainebleau",
33
+ yds: "Yosemite Decimal System",
34
+ french: "French",
35
+ uiaa: "International Climbing and Mountaineering Federation (UIAA)",
36
+ ewbank: "Ewbank",
37
+ saxon: "Saxon",
38
+ norwegian: "Norwegian",
39
+ brazilian_crux: "Brazilian Crux",
40
+ };
41
+ export const BOULDER_GRADE_SYSTEMS = [
42
+ "v_scale",
43
+ "font",
44
+ ];
45
+ export const ROUTE_GRADE_SYSTEMS = [
46
+ "yds",
47
+ "french",
48
+ "uiaa",
49
+ "ewbank",
50
+ "saxon",
51
+ "norwegian",
52
+ "brazilian_crux",
53
+ ];
54
+ export const climbingGradePreferenceSchema = z.object({
55
+ boulder: z.enum(BOULDER_GRADE_SYSTEMS),
56
+ route: z.enum(ROUTE_GRADE_SYSTEMS),
57
+ });
58
+ function sandbagScale(system) {
59
+ const scale = getScale(systemToSandbagScale[system]);
60
+ if (!scale)
61
+ throw new Error(`Sandbag does not support climbing grade system: ${system}`);
62
+ return scale;
63
+ }
64
+ function canonicalGrade(grade, system) {
65
+ const trimmed = grade.trim();
66
+ const scale = sandbagScale(system);
67
+ if (!scale.isType(trimmed))
68
+ return null;
69
+ const normalized = trimmed.toLocaleLowerCase();
70
+ const listedGrade = scale.grades.find((candidate) => candidate.toLocaleLowerCase() === normalized);
71
+ if (listedGrade)
72
+ return listedGrade;
73
+ if (system !== "yds")
74
+ return null;
75
+ const yosemiteBase = /^5\.(\d+)([+-])?$/i.exec(trimmed);
76
+ if (!yosemiteBase)
77
+ return null;
78
+ const major = yosemiteBase[1];
79
+ const hasKnownSubdivision = scale.grades.some((candidate) => {
80
+ const subdivision = /^5\.(\d+)[abcd]$/i.exec(candidate);
81
+ return subdivision?.[1] === major;
82
+ });
83
+ return hasKnownSubdivision ? `5.${major}${yosemiteBase[2] ?? ""}` : null;
84
+ }
85
+ export function gradeSystemsForClimbType(climbType) {
86
+ return climbType === "boulder" ? BOULDER_GRADE_SYSTEMS : ROUTE_GRADE_SYSTEMS;
87
+ }
88
+ export function resolveClimbingGradePreference(value) {
89
+ const parsed = climbingGradePreferenceSchema.safeParse(value);
90
+ return parsed.success ? parsed.data : DEFAULT_CLIMBING_GRADE_PREFERENCE;
91
+ }
92
+ export function gradeOptionsForSystem(system) {
93
+ return sandbagScale(system).grades;
94
+ }
95
+ export function gradeSystemLabel(system) {
96
+ return SYSTEM_LABELS[system];
97
+ }
98
+ export function isGradeSystemForClimbType(system, climbType) {
99
+ return climbType === "boulder"
100
+ ? system === "v_scale" || system === "font"
101
+ : system !== "v_scale" && system !== "font";
102
+ }
103
+ export function isValidClimbingGrade(grade, system) {
104
+ return canonicalGrade(grade, system) !== null;
105
+ }
106
+ export function gradeSortValue(grade, system) {
107
+ const canonical = canonicalGrade(grade, system);
108
+ if (!canonical)
109
+ return null;
110
+ const score = sandbagScale(system).getScore(canonical);
111
+ if (typeof score === "number")
112
+ return score;
113
+ if (Array.isArray(score) && score.length >= 2)
114
+ return (score[0] + score[1]) / 2;
115
+ return null;
116
+ }
117
+ export function convertClimbingGrade(input) {
118
+ const sourceGrade = canonicalGrade(input.grade, input.sourceSystem);
119
+ if (!sourceGrade)
120
+ return null;
121
+ const sourceScale = sandbagScale(input.sourceSystem);
122
+ const displayScale = sandbagScale(input.displaySystem);
123
+ if (sourceScale.conversionGroup !== displayScale.conversionGroup)
124
+ return null;
125
+ const sortValue = gradeSortValue(sourceGrade, input.sourceSystem);
126
+ if (sortValue === null)
127
+ return null;
128
+ return {
129
+ displayGrade: input.sourceSystem === input.displaySystem
130
+ ? sourceGrade
131
+ : convertGrade(sourceGrade, systemToSandbagScale[input.sourceSystem], systemToSandbagScale[input.displaySystem]),
132
+ displaySystem: input.displaySystem,
133
+ sortValue,
134
+ };
75
135
  }
76
- const climbingGradeParser = new ClimbingGradeParser();
77
136
  export function parseClimbingGrade(input) {
78
- return climbingGradeParser.parse(input);
137
+ for (const gradeSystem of ["v_scale", "yds"]) {
138
+ const grade = canonicalGrade(input, gradeSystem);
139
+ const sortValue = grade ? gradeSortValue(grade, gradeSystem) : null;
140
+ if (grade && sortValue !== null)
141
+ return { gradeSystem, grade, sortValue };
142
+ }
143
+ return null;
79
144
  }
80
145
  //# sourceMappingURL=climbing-grades.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"climbing-grades.js","sourceRoot":"","sources":["../src/climbing-grades.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"climbing-grades.js","sourceRoot":"","sources":["../src/climbing-grades.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dofek/training",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Training-science calculations for power, load, performance, and workout planning",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -39,8 +39,10 @@
39
39
  "access": "public"
40
40
  },
41
41
  "dependencies": {
42
- "@dofek/zones": "0.1.7",
43
- "@dofek/scoring": "0.1.7"
42
+ "@openbeta/sandbag": "0.0.55",
43
+ "zod": "4.4.3",
44
+ "@dofek/scoring": "0.1.8",
45
+ "@dofek/zones": "0.1.8"
44
46
  },
45
47
  "scripts": {
46
48
  "build": "tsc",