@racedayready/workouts 0.1.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.
Files changed (46) hide show
  1. package/README.md +28 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/workouts/bike-workout-types.d.ts +14 -0
  7. package/dist/workouts/bike-workout-types.d.ts.map +1 -0
  8. package/dist/workouts/bike-workout-types.js +11 -0
  9. package/dist/workouts/bike-workout-types.js.map +1 -0
  10. package/dist/workouts/bike-workout-types.test.d.ts +2 -0
  11. package/dist/workouts/bike-workout-types.test.d.ts.map +1 -0
  12. package/dist/workouts/bike-workout-types.test.js +21 -0
  13. package/dist/workouts/bike-workout-types.test.js.map +1 -0
  14. package/dist/workouts/run-workout-types.d.ts +14 -0
  15. package/dist/workouts/run-workout-types.d.ts.map +1 -0
  16. package/dist/workouts/run-workout-types.js +11 -0
  17. package/dist/workouts/run-workout-types.js.map +1 -0
  18. package/dist/workouts/run-workout-types.test.d.ts +2 -0
  19. package/dist/workouts/run-workout-types.test.d.ts.map +1 -0
  20. package/dist/workouts/run-workout-types.test.js +21 -0
  21. package/dist/workouts/run-workout-types.test.js.map +1 -0
  22. package/dist/workouts/swim-workout-types.d.ts +27 -0
  23. package/dist/workouts/swim-workout-types.d.ts.map +1 -0
  24. package/dist/workouts/swim-workout-types.js +14 -0
  25. package/dist/workouts/swim-workout-types.js.map +1 -0
  26. package/dist/workouts/swim-workout-types.test.d.ts +2 -0
  27. package/dist/workouts/swim-workout-types.test.d.ts.map +1 -0
  28. package/dist/workouts/swim-workout-types.test.js +22 -0
  29. package/dist/workouts/swim-workout-types.test.js.map +1 -0
  30. package/dist/workouts/workout-base-types.d.ts +10 -0
  31. package/dist/workouts/workout-base-types.d.ts.map +1 -0
  32. package/dist/workouts/workout-base-types.js +12 -0
  33. package/dist/workouts/workout-base-types.js.map +1 -0
  34. package/dist/workouts/workout-types.d.ts +171 -0
  35. package/dist/workouts/workout-types.d.ts.map +1 -0
  36. package/dist/workouts/workout-types.js +23 -0
  37. package/dist/workouts/workout-types.js.map +1 -0
  38. package/dist/workouts/workout-types.test.d.ts +2 -0
  39. package/dist/workouts/workout-types.test.d.ts.map +1 -0
  40. package/dist/workouts/workout-types.test.js +120 -0
  41. package/dist/workouts/workout-types.test.js.map +1 -0
  42. package/dist/workouts/workout-utils.d.ts +2 -0
  43. package/dist/workouts/workout-utils.d.ts.map +1 -0
  44. package/dist/workouts/workout-utils.js +2 -0
  45. package/dist/workouts/workout-utils.js.map +1 -0
  46. package/package.json +38 -0
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @racedayready/workouts
2
+
3
+ Shared workout schemas, types and utilities used by RDR and benchmarking tools.
4
+
5
+ ## Releasing
6
+
7
+ This repo publishes from GitHub Actions when a new version is released.
8
+
9
+ ### Release steps
10
+
11
+ 1. Run checks locally:
12
+
13
+ - `npm ci`
14
+ - `npm run release:check`
15
+
16
+ 2. Bump version and create a tag:
17
+
18
+ - `npm version patch` (or `minor` / `major`)
19
+
20
+ 3. Update the `CHANGELOG.md`
21
+ 4. Open a PR with the changes and merge
22
+ 5. Create a new release
23
+
24
+ - Tag version `vX.Y.Z`
25
+ - Release title `Workouts vX.Y.Z`
26
+ - Paste the content from `CHANGELOG.md` into the description
27
+
28
+ The `publish.yml` workflow will automatically publish the new version to npm upon new release publish.
@@ -0,0 +1,2 @@
1
+ export * from './workouts/workout-types';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './workouts/workout-types';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export declare const BikeWorkoutIndividualItemSchema: z.ZodObject<{
3
+ type: z.ZodLiteral<"individual">;
4
+ id: z.ZodDefault<z.ZodString>;
5
+ name: z.ZodString;
6
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
7
+ discipline: z.ZodLiteral<"bike">;
8
+ zone: z.ZodNumber;
9
+ toZone: z.ZodOptional<z.ZodNumber>;
10
+ target_power_watts: z.ZodOptional<z.ZodNumber>;
11
+ target_cadence_rpm: z.ZodOptional<z.ZodNumber>;
12
+ }, z.core.$strip>;
13
+ export type BikeWorkoutIndividualItem = z.infer<typeof BikeWorkoutIndividualItemSchema>;
14
+ //# sourceMappingURL=bike-workout-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bike-workout-types.d.ts","sourceRoot":"","sources":["../../src/workouts/bike-workout-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,+BAA+B;;;;;;;;;;iBAO1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import { WorkoutIndividualItemBaseSchema } from './workout-base-types';
3
+ export const BikeWorkoutIndividualItemSchema = WorkoutIndividualItemBaseSchema.extend({
4
+ discipline: z.literal('bike'),
5
+ zone: z.number().min(1).max(7),
6
+ toZone: z.number().min(1).max(7).optional(),
7
+ // Bike-specific
8
+ target_power_watts: z.number().min(0).optional(),
9
+ target_cadence_rpm: z.number().min(0).optional(),
10
+ });
11
+ //# sourceMappingURL=bike-workout-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bike-workout-types.js","sourceRoot":"","sources":["../../src/workouts/bike-workout-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,CAAC,MAAM,+BAA+B,GAAG,+BAA+B,CAAC,MAAM,CAAC;IACpF,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3C,gBAAgB;IAChB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACjD,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bike-workout-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bike-workout-types.test.d.ts","sourceRoot":"","sources":["../../src/workouts/bike-workout-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { BikeWorkoutIndividualItemSchema } from './bike-workout-types';
3
+ describe('BikeWorkoutIndividualItemSchema', () => {
4
+ it('enforces bike zones between 1 and 7', () => {
5
+ expect(BikeWorkoutIndividualItemSchema.safeParse({
6
+ type: 'individual',
7
+ id: 'bike-ok',
8
+ name: 'Threshold',
9
+ discipline: 'bike',
10
+ zone: 7,
11
+ }).success).toBe(true);
12
+ expect(BikeWorkoutIndividualItemSchema.safeParse({
13
+ type: 'individual',
14
+ id: 'bike-bad',
15
+ name: 'Too High',
16
+ discipline: 'bike',
17
+ zone: 8,
18
+ }).success).toBe(false);
19
+ });
20
+ });
21
+ //# sourceMappingURL=bike-workout-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bike-workout-types.test.js","sourceRoot":"","sources":["../../src/workouts/bike-workout-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CACJ,+BAA+B,CAAC,SAAS,CAAC;YACxC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,CACJ,+BAA+B,CAAC,SAAS,CAAC;YACxC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export declare const RunWorkoutIndividualItemSchema: z.ZodObject<{
3
+ type: z.ZodLiteral<"individual">;
4
+ id: z.ZodDefault<z.ZodString>;
5
+ name: z.ZodString;
6
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
7
+ discipline: z.ZodLiteral<"run">;
8
+ zone: z.ZodNumber;
9
+ toZone: z.ZodOptional<z.ZodNumber>;
10
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
11
+ target_pace_seconds_per_km: z.ZodOptional<z.ZodNumber>;
12
+ }, z.core.$strip>;
13
+ export type RunWorkoutIndividualItem = z.infer<typeof RunWorkoutIndividualItemSchema>;
14
+ //# sourceMappingURL=run-workout-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-workout-types.d.ts","sourceRoot":"","sources":["../../src/workouts/run-workout-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,8BAA8B;;;;;;;;;;iBAOzC,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import { WorkoutIndividualItemBaseSchema } from './workout-base-types';
3
+ export const RunWorkoutIndividualItemSchema = WorkoutIndividualItemBaseSchema.extend({
4
+ discipline: z.literal('run'),
5
+ zone: z.number().min(1).max(5),
6
+ toZone: z.number().min(1).max(5).optional(),
7
+ // Run-specific
8
+ target_distance_meters: z.number().min(0).optional(),
9
+ target_pace_seconds_per_km: z.number().min(0).optional(),
10
+ });
11
+ //# sourceMappingURL=run-workout-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-workout-types.js","sourceRoot":"","sources":["../../src/workouts/run-workout-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,CAAC,MAAM,8BAA8B,GAAG,+BAA+B,CAAC,MAAM,CAAC;IACnF,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3C,eAAe;IACf,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpD,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACzD,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run-workout-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-workout-types.test.d.ts","sourceRoot":"","sources":["../../src/workouts/run-workout-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { RunWorkoutIndividualItemSchema } from './run-workout-types';
3
+ describe('RunWorkoutIndividualItemSchema', () => {
4
+ it('enforces run zones between 1 and 5', () => {
5
+ expect(RunWorkoutIndividualItemSchema.safeParse({
6
+ type: 'individual',
7
+ id: 'run-ok',
8
+ name: 'Tempo',
9
+ discipline: 'run',
10
+ zone: 5,
11
+ }).success).toBe(true);
12
+ expect(RunWorkoutIndividualItemSchema.safeParse({
13
+ type: 'individual',
14
+ id: 'run-bad',
15
+ name: 'Too High',
16
+ discipline: 'run',
17
+ zone: 6,
18
+ }).success).toBe(false);
19
+ });
20
+ });
21
+ //# sourceMappingURL=run-workout-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-workout-types.test.js","sourceRoot":"","sources":["../../src/workouts/run-workout-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAErE,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CACJ,8BAA8B,CAAC,SAAS,CAAC;YACvC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,CACJ,8BAA8B,CAAC,SAAS,CAAC;YACvC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ export declare const SwimStrokeSchema: z.ZodEnum<{
3
+ free: "free";
4
+ kick: "kick";
5
+ drill: "drill";
6
+ choice: "choice";
7
+ }>;
8
+ export type SwimStroke = z.infer<typeof SwimStrokeSchema>;
9
+ export declare const SwimWorkoutIndividualItemSchema: z.ZodObject<{
10
+ type: z.ZodLiteral<"individual">;
11
+ id: z.ZodDefault<z.ZodString>;
12
+ name: z.ZodString;
13
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
14
+ discipline: z.ZodLiteral<"swim">;
15
+ zone: z.ZodNumber;
16
+ toZone: z.ZodOptional<z.ZodNumber>;
17
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
18
+ stroke: z.ZodOptional<z.ZodEnum<{
19
+ free: "free";
20
+ kick: "kick";
21
+ drill: "drill";
22
+ choice: "choice";
23
+ }>>;
24
+ rest_seconds: z.ZodOptional<z.ZodNumber>;
25
+ }, z.core.$strip>;
26
+ export type SwimWorkoutIndividualItem = z.infer<typeof SwimWorkoutIndividualItemSchema>;
27
+ //# sourceMappingURL=swim-workout-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swim-workout-types.d.ts","sourceRoot":"","sources":["../../src/workouts/swim-workout-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;EAA8C,CAAC;AAC5E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;iBAQ1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ import { WorkoutIndividualItemBaseSchema } from './workout-base-types';
3
+ // TODO: More?
4
+ export const SwimStrokeSchema = z.enum(['free', 'kick', 'drill', 'choice']);
5
+ export const SwimWorkoutIndividualItemSchema = WorkoutIndividualItemBaseSchema.extend({
6
+ discipline: z.literal('swim'),
7
+ zone: z.number().min(1).max(4),
8
+ toZone: z.number().min(1).max(4).optional(),
9
+ // Swim-specific
10
+ target_distance_meters: z.number().min(0).optional(),
11
+ stroke: SwimStrokeSchema.optional(),
12
+ rest_seconds: z.number().min(0).optional(),
13
+ });
14
+ //# sourceMappingURL=swim-workout-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swim-workout-types.js","sourceRoot":"","sources":["../../src/workouts/swim-workout-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,cAAc;AACd,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAG5E,MAAM,CAAC,MAAM,+BAA+B,GAAG,+BAA+B,CAAC,MAAM,CAAC;IACpF,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3C,gBAAgB;IAChB,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpD,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACnC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=swim-workout-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swim-workout-types.test.d.ts","sourceRoot":"","sources":["../../src/workouts/swim-workout-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { SwimWorkoutIndividualItemSchema } from './swim-workout-types';
3
+ describe('SwimWorkoutIndividualItemSchema', () => {
4
+ it('enforces swim zones between 1 and 4', () => {
5
+ expect(SwimWorkoutIndividualItemSchema.safeParse({
6
+ type: 'individual',
7
+ id: 'swim-ok',
8
+ name: 'Swim Main Set',
9
+ discipline: 'swim',
10
+ zone: 4,
11
+ toZone: 4,
12
+ }).success).toBe(true);
13
+ expect(SwimWorkoutIndividualItemSchema.safeParse({
14
+ type: 'individual',
15
+ id: 'swim-bad',
16
+ name: 'Too High',
17
+ discipline: 'swim',
18
+ zone: 5,
19
+ }).success).toBe(false);
20
+ });
21
+ });
22
+ //# sourceMappingURL=swim-workout-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swim-workout-types.test.js","sourceRoot":"","sources":["../../src/workouts/swim-workout-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CACJ,+BAA+B,CAAC,SAAS,CAAC;YACxC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,eAAe;YACrB,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;SACV,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,CACJ,+BAA+B,CAAC,SAAS,CAAC;YACxC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ export declare const WorkoutIndividualItemBaseSchema: z.ZodObject<{
3
+ type: z.ZodLiteral<"individual">;
4
+ id: z.ZodDefault<z.ZodString>;
5
+ name: z.ZodString;
6
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
7
+ zone: z.ZodNumber;
8
+ toZone: z.ZodOptional<z.ZodNumber>;
9
+ }, z.core.$strip>;
10
+ //# sourceMappingURL=workout-base-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-base-types.d.ts","sourceRoot":"","sources":["../../src/workouts/workout-base-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,+BAA+B;;;;;;;iBAQ1C,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from 'zod';
2
+ import { generateWorkoutItemId } from './workout-utils';
3
+ export const WorkoutIndividualItemBaseSchema = z.object({
4
+ type: z.literal('individual'),
5
+ id: z.string().default(generateWorkoutItemId),
6
+ name: z.string(),
7
+ target_duration_seconds: z.number().min(0).optional(),
8
+ // Discipline-specific ranges are enforced in discipline-specific schemas
9
+ zone: z.number().min(1),
10
+ toZone: z.number().min(1).optional(),
11
+ });
12
+ //# sourceMappingURL=workout-base-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-base-types.js","sourceRoot":"","sources":["../../src/workouts/workout-base-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC7B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrD,yEAAyE;IACzE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC"}
@@ -0,0 +1,171 @@
1
+ import { z } from 'zod';
2
+ export type WorkoutCompletionStatus = 'over' | 'complete' | 'incomplete' | 'missed' | 'planned' | 'unplanned' | 'suggested';
3
+ export declare const WorkoutIndividualItemSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4
+ type: z.ZodLiteral<"individual">;
5
+ id: z.ZodDefault<z.ZodString>;
6
+ name: z.ZodString;
7
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
8
+ discipline: z.ZodLiteral<"swim">;
9
+ zone: z.ZodNumber;
10
+ toZone: z.ZodOptional<z.ZodNumber>;
11
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
12
+ stroke: z.ZodOptional<z.ZodEnum<{
13
+ free: "free";
14
+ kick: "kick";
15
+ drill: "drill";
16
+ choice: "choice";
17
+ }>>;
18
+ rest_seconds: z.ZodOptional<z.ZodNumber>;
19
+ }, z.core.$strip>, z.ZodObject<{
20
+ type: z.ZodLiteral<"individual">;
21
+ id: z.ZodDefault<z.ZodString>;
22
+ name: z.ZodString;
23
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
24
+ discipline: z.ZodLiteral<"bike">;
25
+ zone: z.ZodNumber;
26
+ toZone: z.ZodOptional<z.ZodNumber>;
27
+ target_power_watts: z.ZodOptional<z.ZodNumber>;
28
+ target_cadence_rpm: z.ZodOptional<z.ZodNumber>;
29
+ }, z.core.$strip>, z.ZodObject<{
30
+ type: z.ZodLiteral<"individual">;
31
+ id: z.ZodDefault<z.ZodString>;
32
+ name: z.ZodString;
33
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
34
+ discipline: z.ZodLiteral<"run">;
35
+ zone: z.ZodNumber;
36
+ toZone: z.ZodOptional<z.ZodNumber>;
37
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
38
+ target_pace_seconds_per_km: z.ZodOptional<z.ZodNumber>;
39
+ }, z.core.$strip>], "discipline">;
40
+ export type WorkoutIndividualItem = z.infer<typeof WorkoutIndividualItemSchema>;
41
+ export declare const WorkoutGroupItemSchema: z.ZodObject<{
42
+ type: z.ZodLiteral<"group">;
43
+ id: z.ZodDefault<z.ZodString>;
44
+ name: z.ZodOptional<z.ZodString>;
45
+ repeatCount: z.ZodDefault<z.ZodNumber>;
46
+ segments: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
47
+ type: z.ZodLiteral<"individual">;
48
+ id: z.ZodDefault<z.ZodString>;
49
+ name: z.ZodString;
50
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
51
+ discipline: z.ZodLiteral<"swim">;
52
+ zone: z.ZodNumber;
53
+ toZone: z.ZodOptional<z.ZodNumber>;
54
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
55
+ stroke: z.ZodOptional<z.ZodEnum<{
56
+ free: "free";
57
+ kick: "kick";
58
+ drill: "drill";
59
+ choice: "choice";
60
+ }>>;
61
+ rest_seconds: z.ZodOptional<z.ZodNumber>;
62
+ }, z.core.$strip>, z.ZodObject<{
63
+ type: z.ZodLiteral<"individual">;
64
+ id: z.ZodDefault<z.ZodString>;
65
+ name: z.ZodString;
66
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
67
+ discipline: z.ZodLiteral<"bike">;
68
+ zone: z.ZodNumber;
69
+ toZone: z.ZodOptional<z.ZodNumber>;
70
+ target_power_watts: z.ZodOptional<z.ZodNumber>;
71
+ target_cadence_rpm: z.ZodOptional<z.ZodNumber>;
72
+ }, z.core.$strip>, z.ZodObject<{
73
+ type: z.ZodLiteral<"individual">;
74
+ id: z.ZodDefault<z.ZodString>;
75
+ name: z.ZodString;
76
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
77
+ discipline: z.ZodLiteral<"run">;
78
+ zone: z.ZodNumber;
79
+ toZone: z.ZodOptional<z.ZodNumber>;
80
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
81
+ target_pace_seconds_per_km: z.ZodOptional<z.ZodNumber>;
82
+ }, z.core.$strip>], "discipline">>;
83
+ }, z.core.$strip>;
84
+ export type WorkoutGroupItem = z.infer<typeof WorkoutGroupItemSchema>;
85
+ export declare const WorkoutSegmentItemSchema: z.ZodUnion<readonly [z.ZodObject<{
86
+ type: z.ZodLiteral<"group">;
87
+ id: z.ZodDefault<z.ZodString>;
88
+ name: z.ZodOptional<z.ZodString>;
89
+ repeatCount: z.ZodDefault<z.ZodNumber>;
90
+ segments: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
91
+ type: z.ZodLiteral<"individual">;
92
+ id: z.ZodDefault<z.ZodString>;
93
+ name: z.ZodString;
94
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
95
+ discipline: z.ZodLiteral<"swim">;
96
+ zone: z.ZodNumber;
97
+ toZone: z.ZodOptional<z.ZodNumber>;
98
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
99
+ stroke: z.ZodOptional<z.ZodEnum<{
100
+ free: "free";
101
+ kick: "kick";
102
+ drill: "drill";
103
+ choice: "choice";
104
+ }>>;
105
+ rest_seconds: z.ZodOptional<z.ZodNumber>;
106
+ }, z.core.$strip>, z.ZodObject<{
107
+ type: z.ZodLiteral<"individual">;
108
+ id: z.ZodDefault<z.ZodString>;
109
+ name: z.ZodString;
110
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
111
+ discipline: z.ZodLiteral<"bike">;
112
+ zone: z.ZodNumber;
113
+ toZone: z.ZodOptional<z.ZodNumber>;
114
+ target_power_watts: z.ZodOptional<z.ZodNumber>;
115
+ target_cadence_rpm: z.ZodOptional<z.ZodNumber>;
116
+ }, z.core.$strip>, z.ZodObject<{
117
+ type: z.ZodLiteral<"individual">;
118
+ id: z.ZodDefault<z.ZodString>;
119
+ name: z.ZodString;
120
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
121
+ discipline: z.ZodLiteral<"run">;
122
+ zone: z.ZodNumber;
123
+ toZone: z.ZodOptional<z.ZodNumber>;
124
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
125
+ target_pace_seconds_per_km: z.ZodOptional<z.ZodNumber>;
126
+ }, z.core.$strip>], "discipline">>;
127
+ }, z.core.$strip>, z.ZodDiscriminatedUnion<[z.ZodObject<{
128
+ type: z.ZodLiteral<"individual">;
129
+ id: z.ZodDefault<z.ZodString>;
130
+ name: z.ZodString;
131
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
132
+ discipline: z.ZodLiteral<"swim">;
133
+ zone: z.ZodNumber;
134
+ toZone: z.ZodOptional<z.ZodNumber>;
135
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
136
+ stroke: z.ZodOptional<z.ZodEnum<{
137
+ free: "free";
138
+ kick: "kick";
139
+ drill: "drill";
140
+ choice: "choice";
141
+ }>>;
142
+ rest_seconds: z.ZodOptional<z.ZodNumber>;
143
+ }, z.core.$strip>, z.ZodObject<{
144
+ type: z.ZodLiteral<"individual">;
145
+ id: z.ZodDefault<z.ZodString>;
146
+ name: z.ZodString;
147
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
148
+ discipline: z.ZodLiteral<"bike">;
149
+ zone: z.ZodNumber;
150
+ toZone: z.ZodOptional<z.ZodNumber>;
151
+ target_power_watts: z.ZodOptional<z.ZodNumber>;
152
+ target_cadence_rpm: z.ZodOptional<z.ZodNumber>;
153
+ }, z.core.$strip>, z.ZodObject<{
154
+ type: z.ZodLiteral<"individual">;
155
+ id: z.ZodDefault<z.ZodString>;
156
+ name: z.ZodString;
157
+ target_duration_seconds: z.ZodOptional<z.ZodNumber>;
158
+ discipline: z.ZodLiteral<"run">;
159
+ zone: z.ZodNumber;
160
+ toZone: z.ZodOptional<z.ZodNumber>;
161
+ target_distance_meters: z.ZodOptional<z.ZodNumber>;
162
+ target_pace_seconds_per_km: z.ZodOptional<z.ZodNumber>;
163
+ }, z.core.$strip>], "discipline">]>;
164
+ export type WorkoutSegmentItem = z.infer<typeof WorkoutSegmentItemSchema>;
165
+ export declare const WorkoutDisciplineSchema: z.ZodEnum<{
166
+ bike: "bike";
167
+ run: "run";
168
+ swim: "swim";
169
+ }>;
170
+ export type WorkoutDiscipline = z.infer<typeof WorkoutDisciplineSchema>;
171
+ //# sourceMappingURL=workout-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-types.d.ts","sourceRoot":"","sources":["../../src/workouts/workout-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,SAAS,GACT,WAAW,GACX,WAAW,CAAC;AAEhB,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAItC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAGnC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,uBAAuB;;;;EAAkC,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ import { BikeWorkoutIndividualItemSchema } from './bike-workout-types';
3
+ import { generateWorkoutItemId } from './workout-utils';
4
+ import { RunWorkoutIndividualItemSchema } from './run-workout-types';
5
+ import { SwimWorkoutIndividualItemSchema } from './swim-workout-types';
6
+ export const WorkoutIndividualItemSchema = z.discriminatedUnion('discipline', [
7
+ SwimWorkoutIndividualItemSchema,
8
+ BikeWorkoutIndividualItemSchema,
9
+ RunWorkoutIndividualItemSchema,
10
+ ]);
11
+ export const WorkoutGroupItemSchema = z.object({
12
+ type: z.literal('group'),
13
+ id: z.string().default(generateWorkoutItemId),
14
+ name: z.string().optional(),
15
+ repeatCount: z.number().min(1).default(1),
16
+ segments: z.array(WorkoutIndividualItemSchema).min(1),
17
+ });
18
+ export const WorkoutSegmentItemSchema = z.union([
19
+ WorkoutGroupItemSchema,
20
+ WorkoutIndividualItemSchema,
21
+ ]);
22
+ export const WorkoutDisciplineSchema = z.enum(['swim', 'bike', 'run']);
23
+ //# sourceMappingURL=workout-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-types.js","sourceRoot":"","sources":["../../src/workouts/workout-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAWvE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,kBAAkB,CAAC,YAAY,EAAE;IAC5E,+BAA+B;IAC/B,+BAA+B;IAC/B,8BAA8B;CAC/B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACtD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC;IAC9C,sBAAsB;IACtB,2BAA2B;CAC5B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workout-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-types.test.d.ts","sourceRoot":"","sources":["../../src/workouts/workout-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { WorkoutIndividualItemSchema, WorkoutGroupItemSchema, WorkoutSegmentItemSchema, } from './workout-types';
3
+ describe('WorkoutIndividualItemSchema', () => {
4
+ it('accepts valid swim, bike, and run items', () => {
5
+ expect(WorkoutIndividualItemSchema.safeParse({
6
+ type: 'individual',
7
+ id: 'swim-1',
8
+ name: 'Drills',
9
+ discipline: 'swim',
10
+ zone: 2,
11
+ }).success).toBe(true);
12
+ expect(WorkoutIndividualItemSchema.safeParse({
13
+ type: 'individual',
14
+ id: 'bike-1',
15
+ name: 'Tempo',
16
+ discipline: 'bike',
17
+ zone: 6,
18
+ }).success).toBe(true);
19
+ expect(WorkoutIndividualItemSchema.safeParse({
20
+ type: 'individual',
21
+ id: 'run-1',
22
+ name: 'Endurance',
23
+ discipline: 'run',
24
+ zone: 3,
25
+ }).success).toBe(true);
26
+ });
27
+ it('rejects items with invalid discipline', () => {
28
+ expect(WorkoutIndividualItemSchema.safeParse({
29
+ type: 'individual',
30
+ id: 'bad',
31
+ name: '???',
32
+ discipline: 'yoga',
33
+ zone: 1,
34
+ }).success).toBe(false);
35
+ });
36
+ });
37
+ describe('WorkoutGroupItemSchema', () => {
38
+ it('accepts a valid group item with repeatCount and segments', () => {
39
+ const group = {
40
+ type: 'group',
41
+ id: 'group-1',
42
+ name: 'Main Set',
43
+ repeatCount: 2,
44
+ segments: [
45
+ {
46
+ type: 'individual',
47
+ id: 'swim-set-1',
48
+ name: 'Pace',
49
+ discipline: 'swim',
50
+ zone: 2,
51
+ },
52
+ {
53
+ type: 'individual',
54
+ id: 'run-set-1',
55
+ name: 'Intervals',
56
+ discipline: 'run',
57
+ zone: 4,
58
+ },
59
+ ],
60
+ };
61
+ expect(WorkoutGroupItemSchema.safeParse(group).success).toBe(true);
62
+ });
63
+ it('rejects a group with repeatCount < 1', () => {
64
+ const group = {
65
+ type: 'group',
66
+ id: 'group-bad',
67
+ name: 'Bad Set',
68
+ repeatCount: 0,
69
+ segments: [
70
+ {
71
+ type: 'individual',
72
+ id: 'swim-set-2',
73
+ name: 'Long swim',
74
+ discipline: 'swim',
75
+ zone: 2,
76
+ },
77
+ ],
78
+ };
79
+ expect(WorkoutGroupItemSchema.safeParse(group).success).toBe(false);
80
+ });
81
+ it('rejects a group with no segments', () => {
82
+ const group = {
83
+ type: 'group',
84
+ id: 'group-empty',
85
+ name: 'Empty',
86
+ repeatCount: 1,
87
+ segments: [],
88
+ };
89
+ expect(WorkoutGroupItemSchema.safeParse(group).success).toBe(false);
90
+ });
91
+ });
92
+ describe('WorkoutSegmentItemSchema', () => {
93
+ it('accepts both group and individual items', () => {
94
+ const individualItem = {
95
+ type: 'individual',
96
+ id: 'id-abc',
97
+ name: 'Steady',
98
+ discipline: 'bike',
99
+ zone: 5,
100
+ };
101
+ const groupItem = {
102
+ type: 'group',
103
+ id: 'id-group',
104
+ name: 'Brick',
105
+ repeatCount: 1,
106
+ segments: [
107
+ {
108
+ type: 'individual',
109
+ id: 'id-xyz',
110
+ name: 'Interval',
111
+ discipline: 'run',
112
+ zone: 4,
113
+ },
114
+ ],
115
+ };
116
+ expect(WorkoutSegmentItemSchema.safeParse(individualItem).success).toBe(true);
117
+ expect(WorkoutSegmentItemSchema.safeParse(groupItem).success).toBe(true);
118
+ });
119
+ });
120
+ //# sourceMappingURL=workout-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-types.test.js","sourceRoot":"","sources":["../../src/workouts/workout-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CACJ,2BAA2B,CAAC,SAAS,CAAC;YACpC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,CACJ,2BAA2B,CAAC,SAAS,CAAC;YACpC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,CACJ,2BAA2B,CAAC,SAAS,CAAC;YACpC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CACJ,2BAA2B,CAAC,SAAS,CAAC;YACpC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,KAAK;YACX,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,OAAO,CACX,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,YAAY;oBAClB,EAAE,EAAE,YAAY;oBAChB,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE,MAAM;oBAClB,IAAI,EAAE,CAAC;iBACR;gBACD;oBACE,IAAI,EAAE,YAAY;oBAClB,EAAE,EAAE,WAAW;oBACf,IAAI,EAAE,WAAW;oBACjB,UAAU,EAAE,KAAK;oBACjB,IAAI,EAAE,CAAC;iBACR;aACF;SACF,CAAC;QACF,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,YAAY;oBAClB,EAAE,EAAE,YAAY;oBAChB,IAAI,EAAE,WAAW;oBACjB,UAAU,EAAE,MAAM;oBAClB,IAAI,EAAE,CAAC;iBACR;aACF;SACF,CAAC;QACF,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,cAAc,GAAG;YACrB,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,CAAC;SACR,CAAC;QACF,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,YAAY;oBAClB,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,KAAK;oBACjB,IAAI,EAAE,CAAC;iBACR;aACF;SACF,CAAC;QACF,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const generateWorkoutItemId: () => string;
2
+ //# sourceMappingURL=workout-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-utils.d.ts","sourceRoot":"","sources":["../../src/workouts/workout-utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,cAAmD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const generateWorkoutItemId = () => Math.random().toString(36).substring(2, 9);
2
+ //# sourceMappingURL=workout-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-utils.js","sourceRoot":"","sources":["../../src/workouts/workout-utils.ts"],"names":[],"mappings":"AAAA,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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@racedayready/workouts",
3
+ "version": "0.1.0",
4
+ "description": "Workout schemas, types and utilities.",
5
+ "license": "MIT",
6
+ "private": false,
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/RaceDayReady/workouts"
10
+ },
11
+ "type": "module",
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.json",
19
+ "lint": "npm run lint:eslint && npm run lint:prettier",
20
+ "lint:fix": "npm run lint:eslint -- --fix && prettier --write .",
21
+ "test": "vitest run",
22
+ "type-check": "tsc --noEmit -p tsconfig.json",
23
+ "release:check": "npm run lint && npm run type-check && npm run build && npm pack --dry-run",
24
+ "lint:eslint": "eslint .",
25
+ "lint:prettier": "prettier --check ."
26
+ },
27
+ "devDependencies": {
28
+ "@eslint/js": "^10.0.1",
29
+ "eslint": "^10.0.1",
30
+ "prettier": "^3.5.3",
31
+ "typescript": "^5.8.2",
32
+ "typescript-eslint": "^8.56.1",
33
+ "vitest": "^3.2.4"
34
+ },
35
+ "dependencies": {
36
+ "zod": "^4.3.6"
37
+ }
38
+ }