trainingpeaks-sdk
Version:
TypeScript SDK for TrainingPeaks API integration
68 lines (67 loc) • 2.5 kB
JavaScript
import { z } from 'zod';
import { WorkoutStructureSchema } from './workout-structure.schema.js';
export const UserSchema = z.object({
id: z.string().min(1),
name: z.string().trim().min(1).max(100),
username: z.string().trim().min(1).max(100),
avatar: z
.string()
.url()
.or(z.literal(''))
.transform((val) => (val === '' ? undefined : val))
.optional(),
preferences: z.record(z.string(), z.unknown()).optional(),
});
export const AuthTokenSchema = z.object({
accessToken: z.string().min(1),
tokenType: z.string().min(1),
expiresIn: z.number().nonnegative().finite(),
expires: z.date(),
refreshToken: z.string().min(1).optional(),
scope: z.string().min(1).optional(),
});
export const WorkoutSchema = z.object({
id: z.string().min(1),
name: z.string().min(1).max(200),
description: z.string().max(1000),
date: z.date(),
duration: z.number().nonnegative().finite(),
distance: z.number().nonnegative().finite().optional(),
activityType: z.string().min(1).max(50).optional(),
tags: z.array(z.string().min(1).max(50)).optional(),
fileContent: z.string().optional(),
fileName: z.string().min(1).max(255).optional(),
createdAt: z.date().optional(),
updatedAt: z.date().optional(),
structure: WorkoutStructureSchema.optional(),
});
export const TrainingPeaksAthleteSchema = z.object({
athleteId: z.number().positive(),
firstName: z.string().min(1).max(100),
lastName: z.string().min(1).max(100),
email: z.string().email(),
phone: z.string().nullable().optional(),
cellPhone: z.string().nullable().optional(),
age: z.number().nonnegative().optional(),
athleteType: z.number(),
userType: z.number(),
lastPlannedWorkout: z.string().nullable().optional(),
settings: z.unknown().optional(),
personPhotoUrl: z
.string()
.url()
.or(z.literal(''))
.nullable()
.optional()
.transform((val) => (val === '' ? null : val)),
coachedBy: z.number().nullable().optional(),
userName: z.string().min(1),
lastUpgradeOn: z.string().nullable().optional(),
downgradeAllowed: z.boolean().default(false),
expireOn: z.string(),
premiumTrial: z.boolean().default(false),
premiumTrialDaysRemaining: z.number().nonnegative().default(0),
downgradeAllowedOn: z.string().optional(),
workoutIndexState: z.number().default(0),
prCalcState: z.number().default(0),
});