@felixgeelhaar/govee-api-client 2.0.1 → 2.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.
package/README.md CHANGED
@@ -11,6 +11,7 @@ An enterprise-grade TypeScript client library for the Govee Developer REST API.
11
11
 
12
12
  - 🎯 **Type-Safe**: Full TypeScript support with comprehensive type definitions
13
13
  - 🏗️ **Domain-Driven Design**: Clean architecture following DDD principles
14
+ - ✅ **Runtime Validation**: Zod-based API response validation for production safety
14
15
  - ⚡ **Rate Limiting**: High-performance sliding window rate limiter with burst capability
15
16
  - 🔄 **Retry Logic**: Enterprise-grade retry with exponential backoff, jitter, and circuit breaker
16
17
  - 🛡️ **Error Handling**: Comprehensive error hierarchy with specific error types
@@ -168,12 +169,26 @@ import {
168
169
  InvalidApiKeyError,
169
170
  RateLimitError,
170
171
  NetworkError,
172
+ ValidationError,
171
173
  } from '@felixgeelhaar/govee-api-client';
172
174
 
173
175
  try {
174
176
  await client.getDevices();
175
177
  } catch (error) {
176
- if (error instanceof InvalidApiKeyError) {
178
+ if (error instanceof ValidationError) {
179
+ // API returned malformed data that failed validation
180
+ console.log('Validation error:', error.message);
181
+
182
+ // Get detailed validation errors
183
+ const details = error.getValidationDetails();
184
+ details.forEach(detail => {
185
+ console.log(` ${detail.path}: ${detail.message}`);
186
+ console.log(` Received: ${JSON.stringify(detail.received)}`);
187
+ });
188
+
189
+ // Or get a summary string for logging
190
+ console.log('Summary:', error.getValidationSummary());
191
+ } else if (error instanceof InvalidApiKeyError) {
177
192
  console.log('API key is invalid or expired');
178
193
  console.log(error.getRecommendation());
179
194
  } else if (error instanceof RateLimitError) {
@@ -192,6 +207,33 @@ try {
192
207
  }
193
208
  ```
194
209
 
210
+ ### Runtime Validation
211
+
212
+ All API responses are validated at runtime using Zod schemas to ensure data integrity:
213
+
214
+ - **Automatic**: All API calls are validated transparently
215
+ - **Type-safe**: Catches malformed responses before they reach your code
216
+ - **Detailed errors**: `ValidationError` provides specific information about what failed
217
+ - **Production-ready**: Protects against unexpected API changes
218
+
219
+ If you need custom validation, the Zod schemas are exported:
220
+
221
+ ```typescript
222
+ import {
223
+ GoveeDevicesResponseSchema,
224
+ GoveeStateResponseSchema,
225
+ GoveeCommandResponseSchema,
226
+ } from '@felixgeelhaar/govee-api-client';
227
+
228
+ // Use for custom validation scenarios
229
+ const result = GoveeDevicesResponseSchema.safeParse(rawApiData);
230
+ if (result.success) {
231
+ console.log('Valid data:', result.data);
232
+ } else {
233
+ console.log('Validation errors:', result.error);
234
+ }
235
+ ```
236
+
195
237
  ## Rate Limiting & Retry Features
196
238
 
197
239
  The client includes enterprise-grade rate limiting and retry capabilities designed for production environments.
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export { GoveeClient, type GoveeClientConfig } from './GoveeClient';
2
2
  export { GoveeDevice, DeviceState, Command, PowerOnCommand, PowerOffCommand, BrightnessCommand, ColorCommand, ColorTemperatureCommand, CommandFactory, type PowerState, type ColorState, type ColorTemperatureState, type BrightnessState, type StateProperty, } from './domain/entities';
3
3
  export { ColorRgb, ColorTemperature, Brightness } from './domain/value-objects';
4
- export { GoveeApiClientError, GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, } from './errors';
4
+ export { GoveeApiClientError, GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, ValidationError, } from './errors';
5
5
  export { GoveeControlService, type GoveeControlServiceConfig } from './services';
6
6
  export { GoveeDeviceRepository } from './infrastructure';
7
7
  export { type IGoveeDeviceRepository } from './domain/repositories';
8
8
  export { RetryPolicy, type RetryPolicyConfig, type BackoffStrategy, type JitterConfig, type RetryCondition, type CircuitBreakerConfig, type RetryMetrics, } from './infrastructure/retry';
9
+ export { GoveeDevicesResponseSchema, GoveeStateResponseSchema, GoveeCommandResponseSchema, type GoveeDevicesResponse, type GoveeStateResponse, type GoveeCommandResponse, } from './infrastructure/response-schemas';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGpE,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGpE,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,mCAAmC,CAAC"}
package/dist/index.js CHANGED
@@ -5,10 +5,12 @@ export { GoveeDevice, DeviceState, Command, PowerOnCommand, PowerOffCommand, Bri
5
5
  // Value objects
6
6
  export { ColorRgb, ColorTemperature, Brightness } from './domain/value-objects';
7
7
  // Error classes
8
- export { GoveeApiClientError, GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, } from './errors';
8
+ export { GoveeApiClientError, GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, ValidationError, } from './errors';
9
9
  // Services and repositories (for advanced usage)
10
10
  export { GoveeControlService } from './services';
11
11
  export { GoveeDeviceRepository } from './infrastructure';
12
12
  // Retry infrastructure (for custom retry policies)
13
13
  export { RetryPolicy, } from './infrastructure/retry';
14
+ // Validation schemas (for advanced usage)
15
+ export { GoveeDevicesResponseSchema, GoveeStateResponseSchema, GoveeCommandResponseSchema, } from './infrastructure/response-schemas';
14
16
  //# 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;AACd,OAAO,EAAE,WAAW,EAA0B,MAAM,eAAe,CAAC;AAEpE,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,cAAc,GAMf,MAAM,mBAAmB,CAAC;AAE3B,gBAAgB;AAChB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEhF,gBAAgB;AAChB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,UAAU,CAAC;AAElB,iDAAiD;AACjD,OAAO,EAAE,mBAAmB,EAAkC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,mDAAmD;AACnD,OAAO,EACL,WAAW,GAOZ,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,WAAW,EAA0B,MAAM,eAAe,CAAC;AAEpE,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,cAAc,GAMf,MAAM,mBAAmB,CAAC;AAE3B,gBAAgB;AAChB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEhF,gBAAgB;AAChB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,UAAU,CAAC;AAElB,iDAAiD;AACjD,OAAO,EAAE,mBAAmB,EAAkC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,mDAAmD;AACnD,OAAO,EACL,WAAW,GAOZ,MAAM,wBAAwB,CAAC;AAEhC,0CAA0C;AAC1C,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,GAI3B,MAAM,mCAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"GoveeDeviceRepository.d.ts","sourceRoot":"","sources":["../../src/infrastructure/GoveeDeviceRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EACL,WAAW,EAKZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAIrD,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8ED,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAEnE,OAAO,CAAC,iBAAiB;gBAIb,MAAM,EAAE,cAAc;IAgBlC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAqCzB,OAAO,CAAC,eAAe;IAkCjB,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IA+FjC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA8C9D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCjF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,0BAA0B;IA4ClC,OAAO,CAAC,gCAAgC;CA4BzC"}
1
+ {"version":3,"file":"GoveeDeviceRepository.d.ts","sourceRoot":"","sources":["../../src/infrastructure/GoveeDeviceRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EACL,WAAW,EAKZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAerD,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8ED,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAEnE,OAAO,CAAC,iBAAiB;gBAIb,MAAM,EAAE,cAAc;IAgBlC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAqCzB,OAAO,CAAC,eAAe;IAkCjB,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IA8GjC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuD9D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CjF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,0BAA0B;IA4ClC,OAAO,CAAC,gCAAgC;CA4BzC"}
@@ -2,7 +2,8 @@ import axios from 'axios';
2
2
  import { GoveeDevice } from '../domain/entities/GoveeDevice';
3
3
  import { DeviceState, } from '../domain/entities/DeviceState';
4
4
  import { ColorRgb, ColorTemperature, Brightness } from '../domain/value-objects';
5
- import { GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError } from '../errors';
5
+ import { GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, ValidationError, } from '../errors';
6
+ import { GoveeDevicesResponseSchema, GoveeStateResponseSchema, GoveeCommandResponseSchema, } from './response-schemas';
6
7
  export class GoveeDeviceRepository {
7
8
  generateRequestId() {
8
9
  return crypto.randomUUID();
@@ -79,7 +80,13 @@ export class GoveeDeviceRepository {
79
80
  this.logger?.info('Fetching all devices');
80
81
  try {
81
82
  const response = await this.httpClient.get('/router/api/v1/user/devices');
82
- const apiResponse = response.data;
83
+ // Validate response with Zod
84
+ const validationResult = GoveeDevicesResponseSchema.safeParse(response.data);
85
+ if (!validationResult.success) {
86
+ this.logger?.error({ zodError: validationResult.error, rawData: response.data }, 'API response validation failed');
87
+ throw ValidationError.fromZodError(validationResult.error, response.data);
88
+ }
89
+ const apiResponse = validationResult.data;
83
90
  if (apiResponse.code !== 200) {
84
91
  throw new GoveeApiError(`API returned error code ${apiResponse.code}: ${apiResponse.message}`, response.status, apiResponse.code, apiResponse.message);
85
92
  }
@@ -144,7 +151,13 @@ export class GoveeDeviceRepository {
144
151
  },
145
152
  };
146
153
  const response = await this.httpClient.post('/router/api/v1/device/state', requestBody);
147
- const apiResponse = response.data;
154
+ // Validate response with Zod
155
+ const validationResult = GoveeStateResponseSchema.safeParse(response.data);
156
+ if (!validationResult.success) {
157
+ this.logger?.error({ zodError: validationResult.error, rawData: response.data }, 'Device state response validation failed');
158
+ throw ValidationError.fromZodError(validationResult.error, response.data);
159
+ }
160
+ const apiResponse = validationResult.data;
148
161
  if (apiResponse.code !== 200) {
149
162
  throw new GoveeApiError(`API returned error code ${apiResponse.code}: ${apiResponse.message}`, response.status, apiResponse.code, apiResponse.message);
150
163
  }
@@ -173,7 +186,13 @@ export class GoveeDeviceRepository {
173
186
  };
174
187
  try {
175
188
  const response = await this.httpClient.post('/router/api/v1/device/control', requestBody);
176
- const apiResponse = response.data;
189
+ // Validate response with Zod
190
+ const validationResult = GoveeCommandResponseSchema.safeParse(response.data);
191
+ if (!validationResult.success) {
192
+ this.logger?.error({ zodError: validationResult.error, rawData: response.data }, 'Command response validation failed');
193
+ throw ValidationError.fromZodError(validationResult.error, response.data);
194
+ }
195
+ const apiResponse = validationResult.data;
177
196
  if (apiResponse.code !== 200) {
178
197
  throw new GoveeApiError(`API returned error code ${apiResponse.code}: ${apiResponse.message}`, response.status, apiResponse.code, apiResponse.message);
179
198
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GoveeDeviceRepository.js","sourceRoot":"","sources":["../../src/infrastructure/GoveeDeviceRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GoveeDeviceRepository.js","sourceRoot":"","sources":["../../src/infrastructure/GoveeDeviceRepository.ts"],"names":[],"mappings":"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"}
package/docs/EXAMPLES.md CHANGED
@@ -10,6 +10,7 @@ This document provides comprehensive examples for using the Govee API Client lib
10
10
  - [Color Management](#color-management)
11
11
  - [State Management](#state-management)
12
12
  - [Error Handling](#error-handling)
13
+ - [Runtime Validation & Error Recovery](#runtime-validation--error-recovery)
13
14
  - [Rate Limiting & Monitoring](#rate-limiting--monitoring)
14
15
  - [Retry Configuration](#retry-configuration)
15
16
  - [Advanced Usage](#advanced-usage)
@@ -393,10 +394,17 @@ async function comprehensiveErrorHandling() {
393
394
  }
394
395
  } else if (error instanceof ValidationError) {
395
396
  console.error('✅ Validation Error:', error.message);
396
- if (error.field) {
397
- console.log(`📍 Field: ${error.field}`);
398
- console.log(`💥 Value: ${error.value}`);
399
- }
397
+ console.log('📋 Validation Details:');
398
+
399
+ // Get detailed validation errors
400
+ const details = error.getValidationDetails();
401
+ details.forEach(detail => {
402
+ console.log(` 📍 ${detail.path}: ${detail.message}`);
403
+ console.log(` 💥 Received: ${JSON.stringify(detail.received)}`);
404
+ });
405
+
406
+ // Or use summary for quick logging
407
+ console.log('Summary:', error.getValidationSummary());
400
408
  } else {
401
409
  console.error('❓ Unknown Error:', error);
402
410
  }
@@ -438,6 +446,179 @@ async function retryPattern(operation: () => Promise<void>, maxRetries = 3) {
438
446
  }
439
447
  ```
440
448
 
449
+ ## Runtime Validation & Error Recovery
450
+
451
+ ### Understanding Validation Errors
452
+
453
+ All API responses are automatically validated using Zod schemas. If the Govee API returns malformed data, a `ValidationError` is thrown with detailed information about what failed validation.
454
+
455
+ ```typescript
456
+ import { ValidationError } from '@felixgeelhaar/govee-api-client';
457
+
458
+ async function handleValidationErrors() {
459
+ try {
460
+ const devices = await client.getDevices();
461
+ console.log(`Found ${devices.length} devices`);
462
+ } catch (error) {
463
+ if (error instanceof ValidationError) {
464
+ console.error('API returned invalid data');
465
+
466
+ // Get structured validation errors
467
+ const validationDetails = error.getValidationDetails();
468
+
469
+ validationDetails.forEach(({ path, message, received }) => {
470
+ console.log(`Field "${path}" failed validation:`);
471
+ console.log(` Issue: ${message}`);
472
+ console.log(` Received value: ${JSON.stringify(received)}`);
473
+ });
474
+
475
+ // Log the complete Zod error for debugging
476
+ console.log('Zod Error:', error.zodError);
477
+
478
+ // Log the raw API response for investigation
479
+ console.log('Raw Data:', error.rawData);
480
+ }
481
+ }
482
+ }
483
+ ```
484
+
485
+ ### Custom Validation with Exported Schemas
486
+
487
+ For advanced use cases, you can access the Zod schemas directly:
488
+
489
+ ```typescript
490
+ import {
491
+ GoveeDevicesResponseSchema,
492
+ GoveeStateResponseSchema,
493
+ GoveeCommandResponseSchema,
494
+ type GoveeDevicesResponse,
495
+ } from '@felixgeelhaar/govee-api-client';
496
+
497
+ async function customValidation() {
498
+ // Example: Validate data from a cache or external source
499
+ const cachedData: unknown = await getCachedDevices();
500
+
501
+ const validationResult = GoveeDevicesResponseSchema.safeParse(cachedData);
502
+
503
+ if (validationResult.success) {
504
+ // Data is valid and typed
505
+ const response: GoveeDevicesResponse = validationResult.data;
506
+ console.log(`Cached data is valid: ${response.data.length} devices`);
507
+ } else {
508
+ // Handle validation failure
509
+ console.error('Cached data is invalid:', validationResult.error);
510
+ // Fetch fresh data from API
511
+ const freshDevices = await client.getDevices();
512
+ await cacheDevices(freshDevices);
513
+ }
514
+ }
515
+ ```
516
+
517
+ ### Graceful Degradation
518
+
519
+ Implement graceful degradation when validation fails:
520
+
521
+ ```typescript
522
+ async function robustDeviceFetch() {
523
+ try {
524
+ // Try to get devices normally
525
+ return await client.getDevices();
526
+ } catch (error) {
527
+ if (error instanceof ValidationError) {
528
+ console.warn('API response validation failed, using fallback');
529
+
530
+ // Log for investigation
531
+ console.error('Validation error details:', error.getValidationSummary());
532
+
533
+ // Return empty array or cached data as fallback
534
+ const cachedDevices = await getCachedDevices();
535
+ if (cachedDevices && cachedDevices.length > 0) {
536
+ console.log('Using cached devices as fallback');
537
+ return cachedDevices;
538
+ }
539
+
540
+ console.log('No cache available, returning empty array');
541
+ return [];
542
+ }
543
+
544
+ // Re-throw other errors
545
+ throw error;
546
+ }
547
+ }
548
+ ```
549
+
550
+ ### Validation Error Logging for Debugging
551
+
552
+ Create detailed logs for troubleshooting validation issues:
553
+
554
+ ```typescript
555
+ import pino from 'pino';
556
+
557
+ const logger = pino();
558
+
559
+ async function logValidationErrors() {
560
+ try {
561
+ const devices = await client.getDevices();
562
+ return devices;
563
+ } catch (error) {
564
+ if (error instanceof ValidationError) {
565
+ // Structured logging with all validation details
566
+ logger.error(
567
+ {
568
+ err: error,
569
+ validationSummary: error.getValidationSummary(),
570
+ validationDetails: error.getValidationDetails(),
571
+ zodIssues: error.zodError.issues,
572
+ rawData: error.rawData,
573
+ },
574
+ 'API response validation failed'
575
+ );
576
+
577
+ // Send to error tracking service
578
+ await sendToErrorTracker({
579
+ type: 'validation_error',
580
+ message: error.message,
581
+ details: error.getValidationDetails(),
582
+ stack: error.stack,
583
+ });
584
+ }
585
+
586
+ throw error;
587
+ }
588
+ }
589
+ ```
590
+
591
+ ### Testing Validation Behavior
592
+
593
+ Test your error handling for validation failures:
594
+
595
+ ```typescript
596
+ import { ValidationError } from '@felixgeelhaar/govee-api-client';
597
+ import { z } from 'zod';
598
+
599
+ // Simulate validation error for testing
600
+ function simulateValidationError() {
601
+ const mockData = { invalid: 'data' };
602
+ const validationError = z.object({ valid: z.string() }).safeParse(mockData);
603
+
604
+ if (!validationError.success) {
605
+ throw ValidationError.fromZodError(validationError.error, mockData);
606
+ }
607
+ }
608
+
609
+ // Test your error handling
610
+ async function testErrorHandling() {
611
+ try {
612
+ simulateValidationError();
613
+ } catch (error) {
614
+ if (error instanceof ValidationError) {
615
+ console.log('✅ ValidationError handled correctly');
616
+ console.log('Details:', error.getValidationDetails());
617
+ }
618
+ }
619
+ }
620
+ ```
621
+
441
622
  ## Rate Limiting & Monitoring
442
623
 
443
624
  ### Monitor Rate Limiter
@@ -10,6 +10,7 @@ This document provides comprehensive type definitions for the Govee API Client l
10
10
  - [Command Types](#command-types)
11
11
  - [State Types](#state-types)
12
12
  - [Error Types](#error-types)
13
+ - [Validation Types](#validation-types)
13
14
  - [Retry & Rate Limiting Types](#retry--rate-limiting-types)
14
15
  - [Utility Types](#utility-types)
15
16
 
@@ -329,12 +330,15 @@ class NetworkError extends GoveeApiClientError {
329
330
  }
330
331
 
331
332
  class ValidationError extends GoveeApiClientError {
332
- readonly errorType = 'ValidationError';
333
- readonly field?: string;
334
- readonly value?: unknown;
333
+ readonly code = 'VALIDATION_ERROR';
334
+ readonly zodError: ZodError;
335
+ readonly rawData: unknown;
335
336
 
336
- constructor(message: string, field?: string, value?: unknown);
337
- isRetryable(): false;
337
+ constructor(message: string, zodError: ZodError, rawData: unknown);
338
+
339
+ static fromZodError(zodError: ZodError, rawData: unknown): ValidationError;
340
+ getValidationDetails(): Array<{ path: string; message: string; received: unknown }>;
341
+ getValidationSummary(): string;
338
342
  }
339
343
  ```
340
344
 
@@ -350,6 +354,173 @@ function isNetworkError(error: unknown): error is NetworkError;
350
354
  function isValidationError(error: unknown): error is ValidationError;
351
355
  ```
352
356
 
357
+ ## Validation Types
358
+
359
+ ### Zod Schemas
360
+
361
+ Exported Zod schemas for runtime API response validation.
362
+
363
+ ```typescript
364
+ import { z } from 'zod';
365
+
366
+ // Device capability schema
367
+ const GoveeCapabilitySchema: z.ZodType;
368
+
369
+ // Individual device response schema
370
+ const GoveeDeviceResponseSchema: z.ZodType;
371
+
372
+ // Full devices API response schema
373
+ const GoveeDevicesResponseSchema: z.ZodObject<{
374
+ code: z.ZodNumber;
375
+ message: z.ZodString;
376
+ data: z.ZodArray<typeof GoveeDeviceResponseSchema>;
377
+ }>;
378
+
379
+ // Device state capability schema
380
+ const GoveeStateCapabilitySchema: z.ZodObject<{
381
+ type: z.ZodString;
382
+ instance: z.ZodString;
383
+ state: z.ZodObject<{ value: z.ZodUnknown }>;
384
+ }>;
385
+
386
+ // Device state API response schema
387
+ const GoveeStateResponseSchema: z.ZodObject<{
388
+ code: z.ZodNumber;
389
+ message: z.ZodString;
390
+ data: z.ZodObject<{
391
+ device: z.ZodString;
392
+ sku: z.ZodString;
393
+ capabilities: z.ZodArray<typeof GoveeStateCapabilitySchema>;
394
+ }>;
395
+ }>;
396
+
397
+ // Command API response schema
398
+ const GoveeCommandResponseSchema: z.ZodObject<{
399
+ code: z.ZodNumber;
400
+ message: z.ZodString;
401
+ data: z.ZodOptional<z.ZodUnknown>;
402
+ }>;
403
+ ```
404
+
405
+ ### Response Types
406
+
407
+ TypeScript types inferred from Zod schemas.
408
+
409
+ ```typescript
410
+ // Type inferred from GoveeDevicesResponseSchema
411
+ type GoveeDevicesResponse = {
412
+ code: number;
413
+ message: string;
414
+ data: Array<{
415
+ device?: string | null;
416
+ sku?: string | null;
417
+ deviceName?: string | null;
418
+ capabilities?: Array<{
419
+ type?: string | null;
420
+ instance?: string | null;
421
+ parameters?: {
422
+ dataType: string;
423
+ options?: Array<{
424
+ name: string;
425
+ value: unknown;
426
+ }>;
427
+ };
428
+ }> | null;
429
+ }>;
430
+ };
431
+
432
+ // Type inferred from GoveeStateResponseSchema
433
+ type GoveeStateResponse = {
434
+ code: number;
435
+ message: string;
436
+ data: {
437
+ device: string;
438
+ sku: string;
439
+ capabilities: Array<{
440
+ type: string;
441
+ instance: string;
442
+ state: {
443
+ value: unknown;
444
+ };
445
+ }>;
446
+ };
447
+ };
448
+
449
+ // Type inferred from GoveeCommandResponseSchema
450
+ type GoveeCommandResponse = {
451
+ code: number;
452
+ message: string;
453
+ data?: unknown;
454
+ };
455
+ ```
456
+
457
+ ### Using Validation Schemas
458
+
459
+ Examples of using exported schemas for custom validation:
460
+
461
+ ```typescript
462
+ import {
463
+ GoveeDevicesResponseSchema,
464
+ GoveeStateResponseSchema,
465
+ type GoveeDevicesResponse,
466
+ } from '@felixgeelhaar/govee-api-client';
467
+
468
+ // Validate unknown data
469
+ function validateDevicesResponse(data: unknown): GoveeDevicesResponse {
470
+ return GoveeDevicesResponseSchema.parse(data); // Throws on invalid data
471
+ }
472
+
473
+ // Safe validation without throwing
474
+ function safeValidate(data: unknown) {
475
+ const result = GoveeDevicesResponseSchema.safeParse(data);
476
+
477
+ if (result.success) {
478
+ const validData: GoveeDevicesResponse = result.data;
479
+ return validData;
480
+ } else {
481
+ console.error('Validation failed:', result.error);
482
+ return null;
483
+ }
484
+ }
485
+
486
+ // Custom schema composition
487
+ import { z } from 'zod';
488
+
489
+ const ExtendedDeviceSchema = GoveeDevicesResponseSchema.extend({
490
+ metadata: z.object({
491
+ fetchedAt: z.date(),
492
+ cacheKey: z.string(),
493
+ }),
494
+ });
495
+ ```
496
+
497
+ ### ValidationError Details
498
+
499
+ Structure of validation error details returned by `getValidationDetails()`:
500
+
501
+ ```typescript
502
+ interface ValidationDetail {
503
+ path: string; // JSON path to the field that failed (e.g., "data.0.deviceName")
504
+ message: string; // Human-readable error message
505
+ received: unknown; // The actual value that failed validation
506
+ }
507
+
508
+ // Example usage
509
+ try {
510
+ await client.getDevices();
511
+ } catch (error) {
512
+ if (error instanceof ValidationError) {
513
+ const details: ValidationDetail[] = error.getValidationDetails();
514
+
515
+ details.forEach(({ path, message, received }) => {
516
+ console.log(`Field "${path}" is invalid`);
517
+ console.log(`Error: ${message}`);
518
+ console.log(`Got: ${JSON.stringify(received)}`);
519
+ });
520
+ }
521
+ }
522
+ ```
523
+
353
524
  ## Retry & Rate Limiting Types
354
525
 
355
526
  ### RetryPolicy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@felixgeelhaar/govee-api-client",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Enterprise-grade TypeScript client library for the Govee Developer REST API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",