@racedayready/workouts 0.1.4 → 0.1.6

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.d.ts CHANGED
@@ -3,5 +3,5 @@ export * from './workouts/bike-workout-types';
3
3
  export * from './workouts/run-workout-types';
4
4
  export * from './workouts/swim-workout-types';
5
5
  export * from './workouts/workout-types';
6
- export { getTotalDistanceMeters, getTotalDurationSeconds, getTotalSegmentCount, } from './workouts/workout-utils';
6
+ export { getTotalDistanceMeters, getTotalDurationSeconds, getTotalSegmentCount, getDistanceMeters, getDurationSeconds, getWeight, getTotalWeight, } from './workouts/workout-utils';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,cAAc,GACf,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -3,5 +3,5 @@ export * from './workouts/bike-workout-types';
3
3
  export * from './workouts/run-workout-types';
4
4
  export * from './workouts/swim-workout-types';
5
5
  export * from './workouts/workout-types';
6
- export { getTotalDistanceMeters, getTotalDurationSeconds, getTotalSegmentCount, } from './workouts/workout-utils';
6
+ export { getTotalDistanceMeters, getTotalDurationSeconds, getTotalSegmentCount, getDistanceMeters, getDurationSeconds, getWeight, getTotalWeight, } from './workouts/workout-utils';
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,cAAc,GACf,MAAM,0BAA0B,CAAC"}
@@ -5,10 +5,12 @@ export declare const generateWorkoutItemId: () => string;
5
5
  */
6
6
  export declare function getDistanceMeters(item: WorkoutSegmentItem): number;
7
7
  export declare function getDurationSeconds(item: WorkoutSegmentItem): number;
8
+ export declare function getWeight(item: WorkoutSegmentItem): number;
8
9
  /**
9
10
  * Aggregates
10
11
  */
11
12
  export declare function getTotalDistanceMeters(segments: WorkoutSegmentItem[]): number;
12
13
  export declare function getTotalSegmentCount(segments: WorkoutSegmentItem[]): number;
13
14
  export declare function getTotalDurationSeconds(segments: WorkoutSegmentItem[]): number;
15
+ export declare function getTotalWeight(segments: WorkoutSegmentItem[]): number;
14
16
  //# sourceMappingURL=workout-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workout-utils.d.ts","sourceRoot":"","sources":["../../src/workouts/workout-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,eAAO,MAAM,qBAAqB,cAAmD,CAAC;AAEtF;;GAEG;AAEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAWlE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAWnE;AAED;;GAEG;AAEH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAE7E;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAO3E;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAE9E"}
1
+ {"version":3,"file":"workout-utils.d.ts","sourceRoot":"","sources":["../../src/workouts/workout-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,eAAO,MAAM,qBAAqB,cAAmD,CAAC;AAEtF;;GAEG;AAEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAWlE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAWnE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAU1D;AAED;;GAEG;AAEH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAE7E;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAO3E;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAE9E;AAGD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAErE"}
@@ -14,6 +14,15 @@ export function getDurationSeconds(item) {
14
14
  }
15
15
  return 'target_duration_seconds' in item ? (item.target_duration_seconds ?? 0) : 0;
16
16
  }
17
+ export function getWeight(item) {
18
+ if (item.type === 'group') {
19
+ return item.segments.reduce((total, segment) => total + getWeight(segment), 0);
20
+ }
21
+ if (item.discipline === 'swim') {
22
+ return 'target_distance_meters' in item ? (item.target_distance_meters ?? 0) : 0;
23
+ }
24
+ return 'target_duration_seconds' in item ? (item.target_duration_seconds ?? 0) : 0;
25
+ }
17
26
  /**
18
27
  * Aggregates
19
28
  */
@@ -31,4 +40,8 @@ export function getTotalSegmentCount(segments) {
31
40
  export function getTotalDurationSeconds(segments) {
32
41
  return segments.reduce((total, segment) => total + getDurationSeconds(segment), 0);
33
42
  }
43
+ // Weight is duration for run/bike workouts, distance for swim workouts
44
+ export function getTotalWeight(segments) {
45
+ return segments.reduce((total, segment) => total + getWeight(segment), 0);
46
+ }
34
47
  //# sourceMappingURL=workout-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workout-utils.js","sourceRoot":"","sources":["../../src/workouts/workout-utils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEtF;;GAEG;AAEH,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClB,CAAC,GAAW,EAAE,IAAwB,EAAE,EAAE,CAAC,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,EACxE,CAAC,CACF,GAAG,IAAI,CAAC,WAAW,CACrB,CAAC;IACJ,CAAC;IAED,OAAO,wBAAwB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAwB;IACzD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClB,CAAC,GAAW,EAAE,IAAwB,EAAE,EAAE,CAAC,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,EACzE,CAAC,CACF,GAAG,IAAI,CAAC,WAAW,CACrB,CAAC;IACJ,CAAC;IAED,OAAO,yBAAyB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED;;GAEG;AAEH,MAAM,UAAU,sBAAsB,CAAC,QAA8B;IACnE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAA8B;IACjE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,OAAO,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QAC/D,CAAC;QACD,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAA8B;IACpE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC"}
1
+ {"version":3,"file":"workout-utils.js","sourceRoot":"","sources":["../../src/workouts/workout-utils.ts"],"names":[],"mappings":"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"}
@@ -1,199 +1,73 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { generateWorkoutItemId, getDistanceMeters, getDurationSeconds, getTotalDistanceMeters, getTotalDurationSeconds, getTotalSegmentCount, } from './workout-utils';
3
- import { WorkoutGroupItemSchema, WorkoutIndividualItemSchema, } from './workout-types';
4
- const swim = (id, overrides) => ({
2
+ import { generateWorkoutItemId, getTotalDistanceMeters, getTotalDurationSeconds, getTotalSegmentCount, getWeight, } from './workout-utils';
3
+ const swim = (overrides) => ({
5
4
  type: 'individual',
6
- id,
7
- name: id,
5
+ id: 's',
6
+ name: 's',
8
7
  discipline: 'swim',
9
8
  zone: 2,
10
9
  ...overrides,
11
10
  });
12
- const bike = (id, overrides) => ({
11
+ const bike = (overrides) => ({
13
12
  type: 'individual',
14
- id,
15
- name: id,
13
+ id: 'b',
14
+ name: 'b',
16
15
  discipline: 'bike',
17
16
  zone: 4,
18
17
  ...overrides,
19
18
  });
20
- const group = (repeatCount, segments) => ({
21
- type: 'group',
22
- id: 'group',
23
- repeatCount,
24
- segments: segments,
19
+ const run = (overrides) => ({
20
+ type: 'individual',
21
+ id: 'r',
22
+ name: 'r',
23
+ discipline: 'run',
24
+ zone: 2,
25
+ ...overrides,
26
+ });
27
+ const group = (repeatCount, segments) => ({ type: 'group', id: 'g', repeatCount, segments });
28
+ describe('generateWorkoutItemId', () => {
29
+ it('returns unique non-empty strings', () => {
30
+ const id1 = generateWorkoutItemId();
31
+ const id2 = generateWorkoutItemId();
32
+ expect(id1).not.toBe('');
33
+ expect(id1).not.toBe(id2);
34
+ });
25
35
  });
26
36
  describe('getTotalDistanceMeters', () => {
27
37
  it('sums individuals and groups, treating missing distance as 0', () => {
28
38
  const segments = [
29
- swim('warmup', { target_distance_meters: 400 }),
30
- group(3, [
31
- swim('fast', { target_distance_meters: 100 }),
32
- swim('easy', { target_distance_meters: 50 }),
33
- ]),
34
- bike('tempo'), // no distance field
39
+ swim({ target_distance_meters: 100 }),
40
+ bike(), // no distance field
41
+ group(2, [swim({ target_distance_meters: 50 })]),
35
42
  ];
36
- expect(getTotalDistanceMeters(segments)).toBe(850);
43
+ expect(getTotalDistanceMeters(segments)).toBe(100 + 2 * 50);
37
44
  });
38
45
  });
39
46
  describe('getTotalDurationSeconds', () => {
40
47
  it('sums individuals and groups, treating missing duration as 0', () => {
41
48
  const segments = [
42
- bike('warmup', { target_duration_seconds: 600 }),
43
- group(3, [
44
- bike('on', { target_duration_seconds: 300 }),
45
- bike('off', { target_duration_seconds: 300 }),
46
- ]),
47
- swim('cooldown'), // no duration
49
+ bike({ target_duration_seconds: 100 }),
50
+ swim(), // no duration
51
+ group(2, [bike({ target_duration_seconds: 25 })]),
48
52
  ];
49
- expect(getTotalDurationSeconds(segments)).toBe(2400);
53
+ expect(getTotalDurationSeconds(segments)).toBe(100 + 2 * 25);
50
54
  });
51
55
  });
52
56
  describe('getTotalSegmentCount', () => {
53
57
  it('counts individuals as 1 and group segments multiplied by repeatCount', () => {
54
- const segments = [
55
- swim('warmup'),
56
- group(3, [swim('on'), swim('off')]),
57
- swim('cooldown'),
58
- ];
59
- expect(getTotalSegmentCount(segments)).toBe(8);
58
+ const segments = [swim(), group(3, [swim(), swim()])];
59
+ expect(getTotalSegmentCount(segments)).toBe(1 + 3 * 2);
60
60
  });
61
61
  });
62
- describe('getDistanceMeters', () => {
63
- it('returns target_distance_meters for an individual', () => {
64
- const item = WorkoutIndividualItemSchema.parse({
65
- discipline: 'swim',
66
- type: 'individual',
67
- id: 'foo',
68
- name: 'swim',
69
- zone: 2,
70
- target_distance_meters: 400,
71
- });
72
- expect(getDistanceMeters(item)).toBe(400);
73
- });
74
- it('returns zero for an individual without target_distance_meters', () => {
75
- const item = WorkoutIndividualItemSchema.parse({
76
- discipline: 'swim',
77
- type: 'individual',
78
- id: 'foo',
79
- name: 'swim',
80
- zone: 2,
81
- });
82
- expect(getDistanceMeters(item)).toBe(0);
83
- });
84
- it('returns zero if target_distance_meters is null or undefined', () => {
85
- const item = WorkoutIndividualItemSchema.parse({
86
- discipline: 'swim',
87
- type: 'individual',
88
- id: 'foo',
89
- name: 'swim',
90
- zone: 2,
91
- target_distance_meters: undefined,
92
- });
93
- expect(getDistanceMeters(item)).toBe(0);
94
- });
95
- it('aggregates distance for a group (repeatCount)', () => {
96
- const item = WorkoutGroupItemSchema.parse({
97
- type: 'group',
98
- id: 'grp',
99
- repeatCount: 2,
100
- segments: [
101
- WorkoutIndividualItemSchema.parse({
102
- discipline: 'swim',
103
- type: 'individual',
104
- id: 'a',
105
- name: 'swim',
106
- zone: 2,
107
- target_distance_meters: 100,
108
- }),
109
- WorkoutIndividualItemSchema.parse({
110
- discipline: 'swim',
111
- type: 'individual',
112
- id: 'b',
113
- name: 'swim',
114
- zone: 2,
115
- target_distance_meters: 50,
116
- }),
117
- ],
118
- });
119
- // (100+50) * 2 = 300
120
- expect(getDistanceMeters(item)).toBe(300);
121
- });
122
- });
123
- describe('getDurationSeconds', () => {
124
- it('returns target_duration_seconds for an individual', () => {
125
- const item = WorkoutIndividualItemSchema.parse({
126
- discipline: 'bike',
127
- type: 'individual',
128
- id: 'foo',
129
- name: 'bike',
130
- zone: 3,
131
- target_duration_seconds: 120,
132
- });
133
- expect(getDurationSeconds(item)).toBe(120);
134
- });
135
- it('returns zero for an individual without target_duration_seconds', () => {
136
- const item = WorkoutIndividualItemSchema.parse({
137
- discipline: 'bike',
138
- type: 'individual',
139
- id: 'foo',
140
- name: 'bike',
141
- zone: 3,
142
- });
143
- expect(getDurationSeconds(item)).toBe(0);
144
- });
145
- it('returns zero if target_duration_seconds is undefined', () => {
146
- const item = WorkoutIndividualItemSchema.parse({
147
- discipline: 'bike',
148
- type: 'individual',
149
- id: 'foo',
150
- name: 'bike',
151
- zone: 3,
152
- target_duration_seconds: undefined,
153
- });
154
- expect(getDurationSeconds(item)).toBe(0);
155
- });
156
- it('aggregates duration for a group (repeatCount)', () => {
157
- const item = WorkoutGroupItemSchema.parse({
158
- type: 'group',
159
- id: 'grp',
160
- repeatCount: 4,
161
- segments: [
162
- WorkoutIndividualItemSchema.parse({
163
- discipline: 'bike',
164
- type: 'individual',
165
- id: 'c',
166
- name: 'bike',
167
- zone: 3,
168
- target_duration_seconds: 60,
169
- }),
170
- WorkoutIndividualItemSchema.parse({
171
- discipline: 'bike',
172
- type: 'individual',
173
- id: 'd',
174
- name: 'bike',
175
- zone: 3,
176
- target_duration_seconds: 90,
177
- }),
178
- ],
179
- });
180
- // (60+90) * 4 = 600
181
- expect(getDurationSeconds(item)).toBe(600);
182
- });
183
- });
184
- describe('generateWorkoutItemId', () => {
185
- it('returns a non-empty string of reasonable length', () => {
186
- const id = generateWorkoutItemId();
187
- expect(typeof id).toBe('string');
188
- expect(id.length).toBeGreaterThanOrEqual(3);
189
- expect(id.length).toBeLessThanOrEqual(8); // 7 chars per substring(2,9)
62
+ describe('getWeight', () => {
63
+ it('uses distance for swim and duration for bike/run', () => {
64
+ expect(getWeight(swim({ target_distance_meters: 55 }))).toBe(55);
65
+ expect(getWeight(run({ target_duration_seconds: 100 }))).toBe(100);
66
+ expect(getWeight(bike({ target_duration_seconds: 200 }))).toBe(200);
190
67
  });
191
- it('returns unique values on repeated calls', () => {
192
- const ids = new Set();
193
- for (let i = 0; i < 10; i++) {
194
- ids.add(generateWorkoutItemId());
195
- }
196
- expect(ids.size).toBe(10);
68
+ it('returns 0 when value is missing', () => {
69
+ expect(getWeight(swim())).toBe(0);
70
+ expect(getWeight(run())).toBe(0);
197
71
  });
198
72
  });
199
73
  //# sourceMappingURL=workout-utils.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workout-utils.test.js","sourceRoot":"","sources":["../../src/workouts/workout-utils.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workout-utils.test.js","sourceRoot":"","sources":["../../src/workouts/workout-utils.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@racedayready/workouts",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Workout schemas, types and utilities.",
5
5
  "license": "MIT",
6
6
  "private": false,