trainingpeaks-sdk
Version:
TypeScript SDK for TrainingPeaks API integration
182 lines (181 loc) • 6.9 kB
JavaScript
import { z } from 'zod';
export const CredentialsSchema = z.object({
username: z.string().min(1).max(100),
password: z.string().min(1),
});
export const WorkoutFileSchema = z.object({
fileName: z.string().min(1).max(255),
content: z.string().min(1),
mimeType: z.string().min(1).max(100),
});
export const WorkoutFileDataSchema = z.object({
filename: z.string().min(1).max(255),
content: z.union([
z.string(),
z.instanceof(Uint8Array),
z.instanceof(Buffer),
]),
mimeType: z.string().min(1).max(100),
});
export const WorkoutDataSchema = z.object({
name: z.string().min(1).max(200),
description: z.string().optional(),
date: z.string().optional(),
duration: z.number().nonnegative().finite().optional(),
distance: z.number().nonnegative().finite().optional(),
type: z.enum(['BIKE', 'RUN', 'SWIM', 'OTHER']).optional(),
fileData: WorkoutFileDataSchema.optional(),
});
export const UserPreferencesSchema = z.object({
timezone: z.string().min(1),
units: z.enum(['metric', 'imperial']),
language: z.enum(['en', 'es', 'fr', 'de']),
theme: z.enum(['light', 'dark', 'auto']),
notifications: z.boolean(),
});
export const WorkoutMetadataSchema = z.object({
tags: z.array(z.string().min(1)).optional(),
notes: z.string().optional(),
location: z.string().optional(),
weather: z.enum(['sunny', 'cloudy', 'rainy', 'snowy']).optional(),
temperature: z.number().optional(),
});
export const TrainingPeaksAccountSettingsSchema = z.object({
accountSettingsId: z.number(),
userType: z.number(),
isAthlete: z.boolean(),
headerImageUrl: z.string(),
headerLink: z.string(),
helpUrl: z.string(),
logonFailedUrl: z.string(),
logOffUrl: z.string(),
displayTrainingPeaksLogo: z.boolean(),
coachType: z.number(),
isCoached: z.boolean(),
isPremium: z.boolean(),
accessGroupIds: z.array(z.number()),
premiumTrial: z.boolean(),
lastLogon: z.string(),
});
export const TrainingPeaksCalendarSettingsSchema = z.object({
compactView: z.boolean(),
showAvailability: z.boolean(),
showNotes: z.boolean(),
showWorkouts: z.boolean(),
showStrengthWorkouts: z.boolean(),
showNutrition: z.boolean(),
showMetrics: z.boolean(),
showSummary: z.boolean(),
showFitnessFormFatigue: z.boolean(),
showComplianceColoring: z.boolean(),
showWeather: z.boolean(),
orderComplianceBy: z.array(z.string()),
focusEventId: z.number().nullable(),
workoutLabelLayout: z.array(z.number()),
weekSummaryAtpLayout: z.array(z.number()),
showPayments: z.boolean(),
});
export const TrainingPeaksWorkoutSettingsSchema = z.object({
layout: z.record(z.string(), z.array(z.number())),
});
export const TrainingPeaksMetricSchema = z.object({
type: z.number(),
});
export const TrainingPeaksDateOptionsSchema = z.object({
quickDateSelectOption: z.number().nullable(),
startDate: z.string().nullable(),
endDate: z.string().nullable(),
});
export const TrainingPeaksDashboardPodSchema = z.object({
workoutTypeIds: z.array(z.string()).optional(),
quickDateSelectOption: z.number().optional(),
showTSSPerDay: z.boolean().optional(),
showIntensityFactorPerDay: z.boolean().optional(),
showTSBFill: z.boolean().optional(),
atlConstant: z.number().optional(),
atlStartValue: z.number().optional(),
showSecondAtlSeries: z.boolean().optional(),
atlConstant2: z.number().optional(),
atlStartValue2: z.number().optional(),
ctlConstant: z.number().optional(),
ctlStartValue: z.number().optional(),
index: z.number(),
chartType: z.number(),
title: z.string().nullable(),
dateOptions: TrainingPeaksDateOptionsSchema,
durationUnits: z.number().optional(),
summaryType: z.number().optional(),
dateGrouping: z.number().optional(),
caloriesType: z.number().optional(),
includeGoalCalories: z.boolean().optional(),
peakType: z.number().optional(),
useComparison: z.boolean().optional(),
displayState: z.number().optional(),
comparisonDateOptions: TrainingPeaksDateOptionsSchema.optional(),
tags: z.unknown().optional(),
showPlanned: z.boolean().optional(),
hideAverage: z.boolean().optional(),
units: z.number().nullable().optional(),
showMarkers: z.boolean().optional(),
dataFields: z.array(z.number()).optional(),
powerProfileGrouping: z.number().optional(),
displayCategoryLabels: z.boolean().optional(),
displayCaloriesConsumed: z.boolean().optional(),
displayCaloriesExpended: z.boolean().optional(),
displayBy: z.number().optional(),
});
export const TrainingPeaksDashboardSettingsSchema = z.object({
pods: z.array(TrainingPeaksDashboardPodSchema),
dateOptions: TrainingPeaksDateOptionsSchema,
});
export const TrainingPeaksPromptPreferencesSchema = z.object({
showPairUnpairModal: z.boolean(),
showWelcome: z.boolean(),
showGoalsAssistanceBanner: z.boolean(),
showUnpairConfirmationModal: z.boolean(),
'showWhatsNew:CALENDAR_NOTES_ATHLETE': z.boolean(),
showQuickViewTips: z.boolean(),
contextMenuTip: z.boolean(),
showEnterEventModal: z.boolean(),
showExpandoTips: z.boolean(),
searchChalkboard: z.boolean(),
showComplete: z.boolean(),
recuringNewChip: z.boolean(),
weatherNewChip: z.boolean(),
garminMaxStepsWarning: z.boolean(),
});
export const TrainingPeaksPromptChoicesSchema = z.object({
searchChalkboard: z.string(),
showEnterEventModal: z.string(),
showQuickViewTips: z.string(),
showExpandoTips: z.string(),
showComplete: z.string(),
showLandingSelection: z.string(),
});
export const TrainingPeaksPromptDatesSchema = z.object({
searchChalkboard: z.string(),
showEnterEventModal: z.string(),
showQuickViewTips: z.string(),
showExpandoTips: z.string(),
showComplete: z.string(),
showGoalsAssistanceBanner: z.string(),
autoDismissNotifications: z.string(),
});
export const TrainingPeaksPromptSettingsSchema = z.object({
promptPreferences: TrainingPeaksPromptPreferencesSchema,
promptChoices: TrainingPeaksPromptChoicesSchema,
promptDates: TrainingPeaksPromptDatesSchema,
});
export const TrainingPeaksSettingsSchema = z.object({
account: TrainingPeaksAccountSettingsSchema,
calendar: TrainingPeaksCalendarSettingsSchema,
workout: TrainingPeaksWorkoutSettingsSchema,
metrics: z.array(TrainingPeaksMetricSchema),
dashboard: TrainingPeaksDashboardSettingsSchema,
prompt: TrainingPeaksPromptSettingsSchema,
general: z.record(z.string(), z.unknown()).optional(),
experiments: z.record(z.string(), z.unknown()).optional(),
affiliate: z.record(z.string(), z.unknown()).optional(),
appleWatch: z.record(z.string(), z.unknown()).optional(),
privacy: z.record(z.string(), z.unknown()).optional(),
});