ts-watches 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 (44) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +358 -0
  3. package/dist/analysis/index.d.ts +5 -0
  4. package/dist/analysis/personal-records.d.ts +58 -0
  5. package/dist/analysis/race-predictor.d.ts +53 -0
  6. package/dist/analysis/running-dynamics.d.ts +66 -0
  7. package/dist/analysis/training-load.d.ts +40 -0
  8. package/dist/analysis/zones.d.ts +69 -0
  9. package/dist/bin/cli.js +52 -0
  10. package/dist/chunk-gsgt8r0z.js +2 -0
  11. package/dist/cloud/garmin-activity-api.d.ts +129 -0
  12. package/dist/cloud/garmin-connect.d.ts +67 -0
  13. package/dist/cloud/index.d.ts +4 -0
  14. package/dist/cloud/strava.d.ts +88 -0
  15. package/dist/cloud/trainingpeaks.d.ts +48 -0
  16. package/dist/config.d.ts +4 -0
  17. package/dist/drivers/apple.d.ts +17 -0
  18. package/dist/drivers/coros.d.ts +13 -0
  19. package/dist/drivers/garmin.d.ts +12 -0
  20. package/dist/drivers/index.d.ts +6 -0
  21. package/dist/drivers/polar.d.ts +14 -0
  22. package/dist/drivers/suunto.d.ts +13 -0
  23. package/dist/drivers/wahoo.d.ts +13 -0
  24. package/dist/export/csv.d.ts +15 -0
  25. package/dist/export/geojson.d.ts +23 -0
  26. package/dist/export/gpx.d.ts +10 -0
  27. package/dist/export/index.d.ts +4 -0
  28. package/dist/export/tcx.d.ts +10 -0
  29. package/dist/fit/constants.d.ts +606 -0
  30. package/dist/fit/decoder.d.ts +16 -0
  31. package/dist/fit/index.d.ts +3 -0
  32. package/dist/fit/parser.d.ts +21 -0
  33. package/dist/index.d.ts +40 -0
  34. package/dist/realtime/ant-plus.d.ts +201 -0
  35. package/dist/realtime/bluetooth.d.ts +153 -0
  36. package/dist/realtime/index.d.ts +3 -0
  37. package/dist/realtime/live-tracking.d.ts +70 -0
  38. package/dist/src/index.js +324 -0
  39. package/dist/types.d.ts +307 -0
  40. package/dist/workouts/builder.d.ts +184 -0
  41. package/dist/workouts/course.d.ts +74 -0
  42. package/dist/workouts/index.d.ts +3 -0
  43. package/dist/workouts/training-plan.d.ts +77 -0
  44. package/package.json +92 -0
@@ -0,0 +1,21 @@
1
+ import type { FitFileHeader } from '../types';
2
+ // Utility functions for converting FIT values
3
+ export declare function fitTimestampToDate(timestamp: number): Date;
4
+ export declare function semicirclesToDegrees(semicircles: number): number;
5
+ export declare function degreesToSemicircles(degrees: number): number;
6
+ export declare interface FitMessage {
7
+ globalMsgNum: number
8
+ fields: Record<number, unknown>
9
+ }
10
+ export declare interface FitParseResult {
11
+ header: FitFileHeader
12
+ messages: FitMessage[]
13
+ }
14
+ export declare class FitParseError extends Error {
15
+ public offset?: number;
16
+ constructor(message: string, offset?: number);
17
+ }
18
+ export declare class FitParser {
19
+ constructor(data: Buffer | ArrayBuffer | Uint8Array);
20
+ parse(): FitParseResult;
21
+ }
@@ -0,0 +1,40 @@
1
+ // Re-export commonly used types for convenience
2
+ export type {
3
+ Activity,
4
+ ActivityLap,
5
+ ActivityRecord,
6
+ MonitoringData,
7
+ WatchDevice,
8
+ GarminDevice,
9
+ DownloadResult,
10
+ DownloadOptions,
11
+ WatchDriver,
12
+ SleepData,
13
+ StressData,
14
+ HRVData,
15
+ SpO2Data,
16
+ DailyHeartRate,
17
+ BodyBattery,
18
+ DailySteps,
19
+ WeightData,
20
+ GeoPosition,
21
+ SportType,
22
+ SubSportType,
23
+ } from './types';
24
+ // Core exports
25
+ export * from './config';
26
+ export * from './types';
27
+ // FIT file parsing
28
+ export * from './fit/index';
29
+ // Device drivers
30
+ export * from './drivers/index';
31
+ // Data export
32
+ export * from './export/index';
33
+ // Cloud integrations
34
+ export * from './cloud/index';
35
+ // Analysis tools
36
+ export * from './analysis/index';
37
+ // Workout tools
38
+ export * from './workouts/index';
39
+ // Real-time data
40
+ export * from './realtime/index';
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Create an ANT+ scanner
3
+ * Returns a mock scanner - integrate with ant-plus package for real hardware
4
+ */
5
+ export declare function createAntPlusScanner(): AntPlusScanner;
6
+ /**
7
+ * Calculate wheel speed from ANT+ speed sensor data
8
+ */
9
+ export declare function calculateWheelSpeed(currentRevolutions: number, currentEventTime: number, previousRevolutions: number, previousEventTime: number): number;
10
+ /**
11
+ * Calculate cadence from ANT+ cadence sensor data
12
+ */
13
+ export declare function calculateCadence(currentRevolutions: number, currentEventTime: number, previousRevolutions: number, previousEventTime: number): number;
14
+ // ANT+ Device Profile Constants
15
+ export declare const ANT_PLUS_PROFILES: {
16
+ HEART_RATE: {
17
+ deviceType: 120;
18
+ frequency: 57;
19
+ period: 8070;
20
+ searchTimeout: 30
21
+ };
22
+ SPEED_CADENCE: {
23
+ deviceType: 121;
24
+ frequency: 57;
25
+ period: 8086;
26
+ searchTimeout: 30
27
+ };
28
+ BIKE_SPEED: {
29
+ deviceType: 123;
30
+ frequency: 57;
31
+ period: 8118;
32
+ searchTimeout: 30
33
+ };
34
+ BIKE_CADENCE: {
35
+ deviceType: 122;
36
+ frequency: 57;
37
+ period: 8102;
38
+ searchTimeout: 30
39
+ };
40
+ POWER: {
41
+ deviceType: 11;
42
+ frequency: 57;
43
+ period: 8182;
44
+ searchTimeout: 30
45
+ };
46
+ RUNNING_DYNAMICS: {
47
+ deviceType: 26;
48
+ frequency: 57;
49
+ period: 8134;
50
+ searchTimeout: 30
51
+ };
52
+ FITNESS_EQUIPMENT: {
53
+ deviceType: 17;
54
+ frequency: 57;
55
+ period: 8192;
56
+ searchTimeout: 30
57
+ };
58
+ ENVIRONMENT: {
59
+ deviceType: 25;
60
+ frequency: 57;
61
+ period: 8070;
62
+ searchTimeout: 30
63
+ }
64
+ };
65
+ export declare interface AntPlusDevice {
66
+ deviceId: number
67
+ deviceType: AntPlusDeviceType
68
+ transmissionType: number
69
+ name?: string
70
+ batteryStatus?: 'new' | 'good' | 'ok' | 'low' | 'critical'
71
+ }
72
+ export declare interface HeartRateData {
73
+ heartRate: number
74
+ beatCount: number
75
+ beatTime: number
76
+ rrIntervals?: number[]
77
+ operatingTime?: number
78
+ }
79
+ export declare interface SpeedCadenceData {
80
+ speed?: number
81
+ cadence?: number
82
+ wheelRevolutions?: number
83
+ crankRevolutions?: number
84
+ wheelEventTime?: number
85
+ crankEventTime?: number
86
+ }
87
+ export declare interface PowerData {
88
+ instantPower: number
89
+ cadence?: number
90
+ accumulatedPower?: number
91
+ pedalPowerBalance?: number
92
+ torqueEffectiveness?: {
93
+ left: number
94
+ right: number
95
+ }
96
+ pedalSmoothness?: {
97
+ left: number
98
+ right: number
99
+ }
100
+ }
101
+ export declare interface RunningDynamicsData {
102
+ cadence: number
103
+ groundContactTime?: number
104
+ groundContactBalance?: number
105
+ strideLength?: number
106
+ verticalOscillation?: number
107
+ verticalRatio?: number
108
+ stanceTime?: number
109
+ }
110
+ export declare interface FitnessEquipmentData {
111
+ elapsedTime: number
112
+ distance: number
113
+ speed: number
114
+ heartRate?: number
115
+ cadence?: number
116
+ power?: number
117
+ resistance?: number
118
+ incline?: number
119
+ state: 'ready' | 'in_use' | 'finished' | 'paused'
120
+ }
121
+ /**
122
+ * ANT+ Channel configuration
123
+ */
124
+ export declare interface AntPlusChannelConfig {
125
+ deviceType: AntPlusDeviceType
126
+ deviceId?: number
127
+ transmissionType?: number
128
+ frequency?: number
129
+ period?: number
130
+ }
131
+ /**
132
+ * ANT+ Scanner interface
133
+ *
134
+ * Provides an interface for scanning and connecting to ANT+ devices.
135
+ * Actual implementation requires native USB access via ant-plus package or similar.
136
+ */
137
+ export declare interface AntPlusScanner {
138
+ startScanning(deviceTypes?: AntPlusDeviceType[]): Promise<void>
139
+ stopScanning(): Promise<void>
140
+ getDevices(): AntPlusDevice[]
141
+ connect(deviceId: number): Promise<void>
142
+ disconnect(deviceId: number): Promise<void>
143
+ on(event: 'data', handler: AntPlusEventHandler): void
144
+ on(event: 'device_found', handler: (_device: AntPlusDevice) => void): void
145
+ on(event: 'device_lost', handler: (_device: AntPlusDevice) => void): void
146
+ on(event: 'error', handler: (error: Error) => void): void
147
+ off(event: string, handler: (...args: any[]) => void): void
148
+ isAvailable(): boolean
149
+ close(): Promise<void>
150
+ }
151
+ /**
152
+ * ANT+ Protocol Implementation
153
+ *
154
+ * ANT+ is a wireless protocol used by fitness devices for real-time data transmission.
155
+ * This module provides interfaces and utilities for ANT+ communication.
156
+ *
157
+ * Note: Actual ANT+ communication requires native USB access to an ANT+ stick.
158
+ * This module provides the protocol layer - integration with ant-plus npm package
159
+ * or native bindings is required for full functionality.
160
+ */
161
+ export type AntPlusDeviceType = | 'heart_rate'
162
+ | 'speed_cadence'
163
+ | 'power_meter'
164
+ | 'fitness_equipment'
165
+ | 'running_dynamics'
166
+ | 'environment';
167
+ export type AntPlusData = | {
168
+ type: 'heart_rate'
169
+ data: HeartRateData
170
+ }
171
+ | {
172
+ type: 'speed_cadence'
173
+ data: SpeedCadenceData
174
+ }
175
+ | {
176
+ type: 'power_meter'
177
+ data: PowerData
178
+ }
179
+ | {
180
+ type: 'running_dynamics'
181
+ data: RunningDynamicsData
182
+ }
183
+ | {
184
+ type: 'fitness_equipment'
185
+ data: FitnessEquipmentData
186
+ }
187
+ export type AntPlusEventHandler = (_device: AntPlusDevice, _data: AntPlusData) => void;
188
+ /**
189
+ * Mock ANT+ Scanner for testing
190
+ */
191
+ export declare class MockAntPlusScanner implements AntPlusScanner {
192
+ startScanning(_deviceTypes?: AntPlusDeviceType[]): Promise<void>;
193
+ stopScanning(): Promise<void>;
194
+ getDevices(): AntPlusDevice[];
195
+ connect(_deviceId: number): Promise<void>;
196
+ disconnect(_deviceId: number): Promise<void>;
197
+ on(event: string, handler: (...args: any[]) => void): void;
198
+ off(event: string, handler: (...args: any[]) => void): void;
199
+ isAvailable(): boolean;
200
+ close(): Promise<void>;
201
+ }
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Parse heart rate measurement characteristic value
3
+ */
4
+ export declare function parseHeartRateMeasurement(data: DataView): BleHeartRateData;
5
+ /**
6
+ * Parse cycling speed and cadence measurement
7
+ */
8
+ export declare function parseCscMeasurement(data: DataView, prevWheelRevs?: number, prevWheelTime?: number, prevCrankRevs?: number, prevCrankTime?: number): BleCyclingData;
9
+ /**
10
+ * Parse cycling power measurement
11
+ */
12
+ export declare function parsePowerMeasurement(data: DataView): BlePowerData;
13
+ /**
14
+ * Create a BLE scanner
15
+ */
16
+ export declare function createBleScanner(): BleScanner;
17
+ // BLE GATT Service UUIDs
18
+ export declare const BLE_SERVICES: {
19
+ HEART_RATE: '0000180d-0000-1000-8000-00805f9b34fb';
20
+ CYCLING_SPEED_CADENCE: '00001816-0000-1000-8000-00805f9b34fb';
21
+ CYCLING_POWER: '00001818-0000-1000-8000-00805f9b34fb';
22
+ RUNNING_SPEED_CADENCE: '00001814-0000-1000-8000-00805f9b34fb';
23
+ FITNESS_MACHINE: '00001826-0000-1000-8000-00805f9b34fb';
24
+ DEVICE_INFORMATION: '0000180a-0000-1000-8000-00805f9b34fb';
25
+ BATTERY: '0000180f-0000-1000-8000-00805f9b34fb'
26
+ };
27
+ // BLE GATT Characteristic UUIDs
28
+ export declare const BLE_CHARACTERISTICS: {
29
+ HEART_RATE_MEASUREMENT: '00002a37-0000-1000-8000-00805f9b34fb';
30
+ BODY_SENSOR_LOCATION: '00002a38-0000-1000-8000-00805f9b34fb';
31
+ CSC_MEASUREMENT: '00002a5b-0000-1000-8000-00805f9b34fb';
32
+ CSC_FEATURE: '00002a5c-0000-1000-8000-00805f9b34fb';
33
+ CYCLING_POWER_MEASUREMENT: '00002a63-0000-1000-8000-00805f9b34fb';
34
+ CYCLING_POWER_FEATURE: '00002a65-0000-1000-8000-00805f9b34fb';
35
+ RSC_MEASUREMENT: '00002a53-0000-1000-8000-00805f9b34fb';
36
+ RSC_FEATURE: '00002a54-0000-1000-8000-00805f9b34fb';
37
+ FITNESS_MACHINE_FEATURE: '00002acc-0000-1000-8000-00805f9b34fb';
38
+ TREADMILL_DATA: '00002acd-0000-1000-8000-00805f9b34fb';
39
+ INDOOR_BIKE_DATA: '00002ad2-0000-1000-8000-00805f9b34fb';
40
+ BATTERY_LEVEL: '00002a19-0000-1000-8000-00805f9b34fb'
41
+ };
42
+ export declare interface BleDevice {
43
+ id: string
44
+ name: string
45
+ type: BleDeviceType
46
+ rssi?: number
47
+ connected: boolean
48
+ }
49
+ export declare interface BleHeartRateData {
50
+ heartRate: number
51
+ contactDetected?: boolean
52
+ energyExpended?: number
53
+ rrIntervals?: number[]
54
+ }
55
+ export declare interface BleCyclingData {
56
+ speed?: number
57
+ cadence?: number
58
+ wheelRevolutions?: number
59
+ crankRevolutions?: number
60
+ }
61
+ export declare interface BlePowerData {
62
+ instantPower: number
63
+ pedalPowerBalance?: number
64
+ accumulatedTorque?: number
65
+ wheelRevolutions?: number
66
+ crankRevolutions?: number
67
+ cadence?: number
68
+ }
69
+ export declare interface BleRunningData {
70
+ speed: number
71
+ cadence: number
72
+ strideLength?: number
73
+ totalDistance?: number
74
+ }
75
+ export declare interface BleFitnessMachineData {
76
+ speed?: number
77
+ cadence?: number
78
+ power?: number
79
+ heartRate?: number
80
+ distance?: number
81
+ elapsedTime?: number
82
+ resistance?: number
83
+ incline?: number
84
+ status: 'idle' | 'warmup' | 'workout' | 'cooldown' | 'paused'
85
+ }
86
+ /**
87
+ * BLE Scanner interface
88
+ */
89
+ export declare interface BleScanner {
90
+ startScanning(services?: string[]): Promise<void>
91
+ stopScanning(): Promise<void>
92
+ getDevices(): BleDevice[]
93
+ connect(deviceId: string): Promise<void>
94
+ disconnect(deviceId: string): Promise<void>
95
+ subscribe(deviceId: string, characteristic: string): Promise<void>
96
+ on(event: 'data', handler: BleEventHandler): void
97
+ on(event: 'device_found', handler: (_device: BleDevice) => void): void
98
+ on(event: 'device_lost', handler: (_device: BleDevice) => void): void
99
+ on(event: 'connected', handler: (_device: BleDevice) => void): void
100
+ on(event: 'disconnected', handler: (_device: BleDevice) => void): void
101
+ on(event: 'error', handler: (error: Error) => void): void
102
+ off(event: string, handler: (...args: any[]) => void): void
103
+ isAvailable(): Promise<boolean>
104
+ close(): Promise<void>
105
+ }
106
+ /**
107
+ * Bluetooth Low Energy (BLE) Heart Rate and Fitness Device Support
108
+ *
109
+ * This module provides interfaces for connecting to BLE fitness devices.
110
+ * Uses Web Bluetooth API when available, or can be integrated with noble/bleno
111
+ * for Node.js native Bluetooth access.
112
+ */
113
+ export type BleDeviceType = | 'heart_rate'
114
+ | 'cycling_speed_cadence'
115
+ | 'cycling_power'
116
+ | 'running_speed_cadence'
117
+ | 'fitness_machine';
118
+ export type BleData = | {
119
+ type: 'heart_rate'
120
+ data: BleHeartRateData
121
+ }
122
+ | {
123
+ type: 'cycling'
124
+ data: BleCyclingData
125
+ }
126
+ | {
127
+ type: 'power'
128
+ data: BlePowerData
129
+ }
130
+ | {
131
+ type: 'running'
132
+ data: BleRunningData
133
+ }
134
+ | {
135
+ type: 'fitness_machine'
136
+ data: BleFitnessMachineData
137
+ }
138
+ export type BleEventHandler = (_device: BleDevice, _data: BleData) => void;
139
+ /**
140
+ * Mock BLE Scanner for testing
141
+ */
142
+ export declare class MockBleScanner implements BleScanner {
143
+ startScanning(_services?: string[]): Promise<void>;
144
+ stopScanning(): Promise<void>;
145
+ getDevices(): BleDevice[];
146
+ connect(deviceId: string): Promise<void>;
147
+ disconnect(deviceId: string): Promise<void>;
148
+ subscribe(_deviceId: string, _characteristic: string): Promise<void>;
149
+ on(event: string, handler: (...args: any[]) => void): void;
150
+ off(event: string, handler: (...args: any[]) => void): void;
151
+ isAvailable(): Promise<boolean>;
152
+ close(): Promise<void>;
153
+ }
@@ -0,0 +1,3 @@
1
+ export * from './ant-plus';
2
+ export * from './bluetooth';
3
+ export * from './live-tracking';
@@ -0,0 +1,70 @@
1
+ import type { GeoPosition, ActivityRecord } from '../types';
2
+ /**
3
+ * Create a live tracking manager
4
+ */
5
+ export declare function createLiveTracking(config?: LiveTrackingConfig): LiveTrackingManager;
6
+ /**
7
+ * Convert live tracking session to activity records
8
+ */
9
+ export declare function sessionToRecords(session: LiveTrackingSession): ActivityRecord[];
10
+ /**
11
+ * Format live tracking stats for display
12
+ */
13
+ export declare function formatLiveStats(session: LiveTrackingSession): {
14
+ distance: string
15
+ duration: string
16
+ pace: string
17
+ speed: string
18
+ heartRate: string
19
+ power: string
20
+ };
21
+ export declare interface LiveTrackingSession {
22
+ id: string
23
+ name?: string
24
+ startTime: Date
25
+ lastUpdate: Date
26
+ currentPosition?: GeoPosition
27
+ totalDistance: number
28
+ elapsedTime: number
29
+ currentSpeed?: number
30
+ currentHeartRate?: number
31
+ currentCadence?: number
32
+ currentPower?: number
33
+ status: 'active' | 'paused' | 'stopped'
34
+ trackPoints: GeoPosition[]
35
+ }
36
+ export declare interface LiveTrackingConfig {
37
+ updateInterval?: number
38
+ shareUrl?: string
39
+ enableHeartRate?: boolean
40
+ enablePower?: boolean
41
+ onUpdate?: (session: LiveTrackingSession) => void
42
+ onError?: (error: Error) => void
43
+ }
44
+ export type LiveTrackingEventHandler = {
45
+ 'position': (position: GeoPosition) => void
46
+ 'update': (session: LiveTrackingSession) => void
47
+ 'start': (session: LiveTrackingSession) => void
48
+ 'stop': (session: LiveTrackingSession) => void
49
+ 'pause': (session: LiveTrackingSession) => void
50
+ 'resume': (session: LiveTrackingSession) => void
51
+ 'error': (error: Error) => void
52
+ }
53
+ /**
54
+ * Live tracking manager for real-time activity sharing
55
+ */
56
+ export declare class LiveTrackingManager {
57
+ constructor(config?: LiveTrackingConfig);
58
+ start(name?: string): LiveTrackingSession;
59
+ stop(): LiveTrackingSession | null;
60
+ pause(): void;
61
+ resume(): void;
62
+ updatePosition(position: GeoPosition): void;
63
+ updateHeartRate(heartRate: number): void;
64
+ updatePower(power: number): void;
65
+ updateCadence(cadence: number): void;
66
+ getSession(): LiveTrackingSession | null;
67
+ getShareUrl(): string | null;
68
+ on<K extends keyof LiveTrackingEventHandler>(event: K, handler: LiveTrackingEventHandler[K]): void;
69
+ off<K extends keyof LiveTrackingEventHandler>(event: K, handler: LiveTrackingEventHandler[K]): void;
70
+ }