@seamapi/types 1.18.4 → 1.18.6

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 (34) hide show
  1. package/dist/devicedb.cjs +70 -4
  2. package/dist/devicedb.cjs.map +1 -1
  3. package/dist/devicedb.d.cts +662 -74
  4. package/lib/seam/devicedb/index.d.ts +2 -2
  5. package/lib/seam/devicedb/index.js +1 -1
  6. package/lib/seam/devicedb/index.js.map +1 -1
  7. package/lib/seam/devicedb/public-models/device-model-v0.d.ts +30 -0
  8. package/lib/seam/devicedb/public-models/device-model-v0.js +12 -0
  9. package/lib/seam/devicedb/public-models/device-model-v0.js.map +1 -0
  10. package/lib/seam/devicedb/public-models/device-model-v1.d.ts +692 -0
  11. package/lib/seam/devicedb/public-models/device-model-v1.js +83 -0
  12. package/lib/seam/devicedb/public-models/device-model-v1.js.map +1 -0
  13. package/lib/seam/devicedb/public-models/image-reference.d.ts +15 -0
  14. package/lib/seam/devicedb/public-models/image-reference.js +7 -0
  15. package/lib/seam/devicedb/public-models/image-reference.js.map +1 -0
  16. package/lib/seam/devicedb/public-models/index.d.ts +4 -0
  17. package/lib/seam/devicedb/public-models/index.js +5 -0
  18. package/lib/seam/devicedb/public-models/index.js.map +1 -0
  19. package/lib/seam/devicedb/public-models/manufacturer.d.ts +44 -0
  20. package/lib/seam/devicedb/public-models/manufacturer.js +11 -0
  21. package/lib/seam/devicedb/public-models/manufacturer.js.map +1 -0
  22. package/lib/seam/devicedb/route-types.d.ts +78 -4
  23. package/package.json +1 -1
  24. package/src/lib/seam/devicedb/index.ts +2 -2
  25. package/src/lib/seam/devicedb/public-models/device-model-v0.ts +14 -0
  26. package/src/lib/seam/devicedb/public-models/device-model-v1.ts +99 -0
  27. package/src/lib/seam/devicedb/public-models/image-reference.ts +9 -0
  28. package/src/lib/seam/devicedb/public-models/index.ts +4 -0
  29. package/src/lib/seam/devicedb/public-models/manufacturer.ts +14 -0
  30. package/src/lib/seam/devicedb/route-types.ts +153 -41
  31. package/lib/seam/devicedb/public-models.d.ts +0 -273
  32. package/lib/seam/devicedb/public-models.js +0 -45
  33. package/lib/seam/devicedb/public-models.js.map +0 -1
  34. package/src/lib/seam/devicedb/public-models.ts +0 -56
@@ -0,0 +1,83 @@
1
+ import { z } from 'zod';
2
+ import { image_reference } from './image-reference.js';
3
+ import { manufacturer } from './manufacturer.js';
4
+ const smartlock = z.object({
5
+ main_category: z.literal('smartlock'),
6
+ physical_properties: z.object({
7
+ lock_type: z.enum([
8
+ 'deadbolt',
9
+ 'lever',
10
+ 'mortise',
11
+ 'lockbox',
12
+ 'cylinder',
13
+ 'padlock',
14
+ 'locker',
15
+ ]),
16
+ has_physical_key: z.boolean(),
17
+ has_camera: z.boolean(),
18
+ }),
19
+ software_features: z.object({
20
+ can_remotely_unlock: z.boolean(),
21
+ can_program_access_codes: z.boolean(),
22
+ can_program_access_schedules: z.boolean(),
23
+ can_program_access_codes_offline: z.boolean(),
24
+ }),
25
+ });
26
+ const sensor = z.object({
27
+ main_category: z.literal('sensor'),
28
+ physical_properties: z.object({
29
+ has_noise_sensor: z.boolean(),
30
+ has_humidity_sensor: z.boolean(),
31
+ has_temperature_sensor: z.boolean(),
32
+ has_occupancy_detection: z.boolean(),
33
+ }),
34
+ });
35
+ const thermostat = z.object({
36
+ main_category: z.literal('thermostat'),
37
+ physical_properties: z.object({
38
+ available_modes: z.enum(['heat', 'cool', 'fan', 'eco']).array(),
39
+ is_heat_pump_compatible: z.boolean(),
40
+ has_occupancy_detection: z.boolean(),
41
+ supports_demand_response: z.boolean(),
42
+ has_humidity_sensor: z.boolean(),
43
+ has_temperature_sensor: z.boolean(),
44
+ supports_emergency_heating_mode: z.boolean(),
45
+ }),
46
+ software_features: z.object({
47
+ can_program_climate_schedules: z.boolean(),
48
+ }),
49
+ });
50
+ const relay = z.object({
51
+ main_category: z.literal('relay'),
52
+ });
53
+ export const device_model_category_specific_properties = z.discriminatedUnion('main_category', [smartlock, sensor, thermostat, relay]);
54
+ export const base_device_model_v1 = z.object({
55
+ device_model_id: z.string().uuid(),
56
+ manufacturer,
57
+ is_device_supported: z.boolean(),
58
+ display_name: z.string(),
59
+ description: z.string(),
60
+ product_url: z.string(),
61
+ main_connection_type: z.enum(['wifi', 'zwave', 'zigbee', 'unknown']),
62
+ aesthetic_variants: z
63
+ .object({
64
+ slug: z.string(),
65
+ display_name: z.string(),
66
+ primary_color_hex: z.string().optional(),
67
+ manufacturer_sku: z.string(),
68
+ front_image: image_reference.optional(),
69
+ back_image: image_reference.optional(),
70
+ })
71
+ .array(),
72
+ power_sources: z
73
+ .enum([
74
+ 'battery',
75
+ 'hardwired',
76
+ 'mechanical_harvesting',
77
+ 'wireless',
78
+ 'ethernet',
79
+ ])
80
+ .array(),
81
+ });
82
+ export const device_model_v1 = base_device_model_v1.and(device_model_category_specific_properties);
83
+ //# sourceMappingURL=device-model-v1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-model-v1.js","sourceRoot":"","sources":["../../../../src/lib/seam/devicedb/public-models/device-model-v1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ export declare const image_reference: z.ZodObject<{
3
+ url: z.ZodString;
4
+ width: z.ZodNumber;
5
+ height: z.ZodNumber;
6
+ }, "strip", z.ZodTypeAny, {
7
+ height: number;
8
+ width: number;
9
+ url: string;
10
+ }, {
11
+ height: number;
12
+ width: number;
13
+ url: string;
14
+ }>;
15
+ export type ImageReference = z.infer<typeof image_reference>;
@@ -0,0 +1,7 @@
1
+ import { z } from 'zod';
2
+ export const image_reference = z.object({
3
+ url: z.string().url(),
4
+ width: z.number(),
5
+ height: z.number(),
6
+ });
7
+ //# sourceMappingURL=image-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-reference.js","sourceRoot":"","sources":["../../../../src/lib/seam/devicedb/public-models/image-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './device-model-v0.js';
2
+ export * from './device-model-v1.js';
3
+ export * from './image-reference.js';
4
+ export * from './manufacturer.js';
@@ -0,0 +1,5 @@
1
+ export * from './device-model-v0.js';
2
+ export * from './device-model-v1.js';
3
+ export * from './image-reference.js';
4
+ export * from './manufacturer.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/seam/devicedb/public-models/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,44 @@
1
+ import { z } from 'zod';
2
+ export declare const manufacturer: z.ZodObject<{
3
+ manufacturer_id: z.ZodString;
4
+ display_name: z.ZodString;
5
+ logo: z.ZodOptional<z.ZodObject<{
6
+ url: z.ZodString;
7
+ width: z.ZodNumber;
8
+ height: z.ZodNumber;
9
+ }, "strip", z.ZodTypeAny, {
10
+ height: number;
11
+ width: number;
12
+ url: string;
13
+ }, {
14
+ height: number;
15
+ width: number;
16
+ url: string;
17
+ }>>;
18
+ integration: z.ZodEnum<["stable", "beta", "planned", "unsupported"]>;
19
+ is_connect_webview_supported: z.ZodBoolean;
20
+ requires_seam_support_to_add_account: z.ZodBoolean;
21
+ }, "strip", z.ZodTypeAny, {
22
+ display_name: string;
23
+ manufacturer_id: string;
24
+ integration: "beta" | "stable" | "unsupported" | "planned";
25
+ is_connect_webview_supported: boolean;
26
+ requires_seam_support_to_add_account: boolean;
27
+ logo?: {
28
+ height: number;
29
+ width: number;
30
+ url: string;
31
+ } | undefined;
32
+ }, {
33
+ display_name: string;
34
+ manufacturer_id: string;
35
+ integration: "beta" | "stable" | "unsupported" | "planned";
36
+ is_connect_webview_supported: boolean;
37
+ requires_seam_support_to_add_account: boolean;
38
+ logo?: {
39
+ height: number;
40
+ width: number;
41
+ url: string;
42
+ } | undefined;
43
+ }>;
44
+ export type Manufacturer = z.infer<typeof manufacturer>;
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ import { image_reference } from './image-reference.js';
3
+ export const manufacturer = z.object({
4
+ manufacturer_id: z.string().uuid(),
5
+ display_name: z.string(),
6
+ logo: image_reference.optional(),
7
+ integration: z.enum(['stable', 'beta', 'planned', 'unsupported']),
8
+ is_connect_webview_supported: z.boolean(),
9
+ requires_seam_support_to_add_account: z.boolean(),
10
+ });
11
+ //# sourceMappingURL=manufacturer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manufacturer.js","sourceRoot":"","sources":["../../../../src/lib/seam/devicedb/public-models/manufacturer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,IAAI,EAAE,eAAe,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACjE,4BAA4B,EAAE,CAAC,CAAC,OAAO,EAAE;IACzC,oCAAoC,EAAE,CAAC,CAAC,OAAO,EAAE;CAClD,CAAC,CAAA"}
@@ -28,7 +28,6 @@ export interface Routes {
28
28
  description: string;
29
29
  product_url: string;
30
30
  main_connection_type: 'wifi' | 'zwave' | 'zigbee' | 'unknown';
31
- main_category: 'smartlock' | 'thermostat' | 'noise_sensor';
32
31
  aesthetic_variants: Array<{
33
32
  slug: string;
34
33
  display_name: string;
@@ -45,7 +44,45 @@ export interface Routes {
45
44
  height: number;
46
45
  } | undefined;
47
46
  }>;
48
- };
47
+ power_sources: Array<'battery' | 'hardwired' | 'mechanical_harvesting' | 'wireless' | 'ethernet'>;
48
+ } & ({
49
+ main_category: 'smartlock';
50
+ physical_properties: {
51
+ lock_type: 'deadbolt' | 'lever' | 'mortise' | 'lockbox' | 'cylinder' | 'padlock' | 'locker';
52
+ has_physical_key: boolean;
53
+ has_camera: boolean;
54
+ };
55
+ software_features: {
56
+ can_remotely_unlock: boolean;
57
+ can_program_access_codes: boolean;
58
+ can_program_access_schedules: boolean;
59
+ can_program_access_codes_offline: boolean;
60
+ };
61
+ } | {
62
+ main_category: 'sensor';
63
+ physical_properties: {
64
+ has_noise_sensor: boolean;
65
+ has_humidity_sensor: boolean;
66
+ has_temperature_sensor: boolean;
67
+ has_occupancy_detection: boolean;
68
+ };
69
+ } | {
70
+ main_category: 'thermostat';
71
+ physical_properties: {
72
+ available_modes: Array<'heat' | 'cool' | 'fan' | 'eco'>;
73
+ is_heat_pump_compatible: boolean;
74
+ has_occupancy_detection: boolean;
75
+ supports_demand_response: boolean;
76
+ has_humidity_sensor: boolean;
77
+ has_temperature_sensor: boolean;
78
+ supports_emergency_heating_mode: boolean;
79
+ };
80
+ software_features: {
81
+ can_program_climate_schedules: boolean;
82
+ };
83
+ } | {
84
+ main_category: 'relay';
85
+ });
49
86
  };
50
87
  };
51
88
  '/v1/device_models/list': {
@@ -80,7 +117,6 @@ export interface Routes {
80
117
  description: string;
81
118
  product_url: string;
82
119
  main_connection_type: 'wifi' | 'zwave' | 'zigbee' | 'unknown';
83
- main_category: 'smartlock' | 'thermostat' | 'noise_sensor';
84
120
  aesthetic_variants: Array<{
85
121
  slug: string;
86
122
  display_name: string;
@@ -97,7 +133,45 @@ export interface Routes {
97
133
  height: number;
98
134
  } | undefined;
99
135
  }>;
100
- }>;
136
+ power_sources: Array<'battery' | 'hardwired' | 'mechanical_harvesting' | 'wireless' | 'ethernet'>;
137
+ } & ({
138
+ main_category: 'smartlock';
139
+ physical_properties: {
140
+ lock_type: 'deadbolt' | 'lever' | 'mortise' | 'lockbox' | 'cylinder' | 'padlock' | 'locker';
141
+ has_physical_key: boolean;
142
+ has_camera: boolean;
143
+ };
144
+ software_features: {
145
+ can_remotely_unlock: boolean;
146
+ can_program_access_codes: boolean;
147
+ can_program_access_schedules: boolean;
148
+ can_program_access_codes_offline: boolean;
149
+ };
150
+ } | {
151
+ main_category: 'sensor';
152
+ physical_properties: {
153
+ has_noise_sensor: boolean;
154
+ has_humidity_sensor: boolean;
155
+ has_temperature_sensor: boolean;
156
+ has_occupancy_detection: boolean;
157
+ };
158
+ } | {
159
+ main_category: 'thermostat';
160
+ physical_properties: {
161
+ available_modes: Array<'heat' | 'cool' | 'fan' | 'eco'>;
162
+ is_heat_pump_compatible: boolean;
163
+ has_occupancy_detection: boolean;
164
+ supports_demand_response: boolean;
165
+ has_humidity_sensor: boolean;
166
+ has_temperature_sensor: boolean;
167
+ supports_emergency_heating_mode: boolean;
168
+ };
169
+ software_features: {
170
+ can_program_climate_schedules: boolean;
171
+ };
172
+ } | {
173
+ main_category: 'relay';
174
+ })>;
101
175
  };
102
176
  };
103
177
  '/v1/manufacturers/get': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamapi/types",
3
- "version": "1.18.4",
3
+ "version": "1.18.6",
4
4
  "description": "TypeScript types for the Seam API.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -1,4 +1,4 @@
1
- import * as schemas from './public-models.js'
1
+ import * as schemas from './public-models/index.js'
2
2
 
3
3
  export type { Routes } from './route-types.js'
4
4
  export { schemas }
@@ -7,4 +7,4 @@ export type {
7
7
  DeviceModelV1,
8
8
  ImageReference,
9
9
  Manufacturer,
10
- } from './public-models.js'
10
+ } from './public-models/index.js'
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod'
2
+
3
+ export const device_model_v0 = z.object({
4
+ main_category: z.string(),
5
+ model_name: z.string(),
6
+ manufacturer_model_id: z.string(),
7
+ connection_type: z.enum(['wifi', 'zwave', 'zigbee', 'unknown']),
8
+ support_level: z.enum(['live', 'beta', 'unsupported']),
9
+ brand: z.string(),
10
+ icon_url: z.string(),
11
+ seam_device_model_page_url: z.string(),
12
+ })
13
+
14
+ export type DeviceModelV0 = z.infer<typeof device_model_v0>
@@ -0,0 +1,99 @@
1
+ import { z } from 'zod'
2
+
3
+ import { image_reference } from './image-reference.js'
4
+ import { manufacturer } from './manufacturer.js'
5
+
6
+ const smartlock = z.object({
7
+ main_category: z.literal('smartlock'),
8
+ physical_properties: z.object({
9
+ lock_type: z.enum([
10
+ 'deadbolt',
11
+ 'lever',
12
+ 'mortise',
13
+ 'lockbox',
14
+ 'cylinder',
15
+ 'padlock',
16
+ 'locker',
17
+ ]),
18
+ has_physical_key: z.boolean(),
19
+ has_camera: z.boolean(),
20
+ }),
21
+ software_features: z.object({
22
+ can_remotely_unlock: z.boolean(),
23
+ can_program_access_codes: z.boolean(),
24
+ can_program_access_schedules: z.boolean(),
25
+ can_program_access_codes_offline: z.boolean(),
26
+ }),
27
+ })
28
+
29
+ const sensor = z.object({
30
+ main_category: z.literal('sensor'),
31
+ physical_properties: z.object({
32
+ has_noise_sensor: z.boolean(),
33
+ has_humidity_sensor: z.boolean(),
34
+ has_temperature_sensor: z.boolean(),
35
+ has_occupancy_detection: z.boolean(),
36
+ }),
37
+ })
38
+
39
+ const thermostat = z.object({
40
+ main_category: z.literal('thermostat'),
41
+ physical_properties: z.object({
42
+ available_modes: z.enum(['heat', 'cool', 'fan', 'eco']).array(),
43
+ is_heat_pump_compatible: z.boolean(),
44
+ has_occupancy_detection: z.boolean(),
45
+ supports_demand_response: z.boolean(),
46
+ has_humidity_sensor: z.boolean(),
47
+ has_temperature_sensor: z.boolean(),
48
+ supports_emergency_heating_mode: z.boolean(),
49
+ }),
50
+ software_features: z.object({
51
+ can_program_climate_schedules: z.boolean(),
52
+ }),
53
+ })
54
+
55
+ const relay = z.object({
56
+ main_category: z.literal('relay'),
57
+ })
58
+
59
+ export const device_model_category_specific_properties = z.discriminatedUnion(
60
+ 'main_category',
61
+ [smartlock, sensor, thermostat, relay],
62
+ )
63
+
64
+ export const base_device_model_v1 = z.object({
65
+ device_model_id: z.string().uuid(),
66
+ manufacturer,
67
+ is_device_supported: z.boolean(),
68
+ display_name: z.string(),
69
+ description: z.string(),
70
+ product_url: z.string(),
71
+ main_connection_type: z.enum(['wifi', 'zwave', 'zigbee', 'unknown']),
72
+ aesthetic_variants: z
73
+ .object({
74
+ slug: z.string(),
75
+ display_name: z.string(),
76
+ primary_color_hex: z.string().optional(),
77
+ manufacturer_sku: z.string(),
78
+ front_image: image_reference.optional(),
79
+ back_image: image_reference.optional(),
80
+ })
81
+ .array(),
82
+ power_sources: z
83
+ .enum([
84
+ 'battery',
85
+ 'hardwired',
86
+ 'mechanical_harvesting',
87
+ 'wireless',
88
+ 'ethernet',
89
+ ])
90
+ .array(),
91
+ })
92
+
93
+ export type BaseDeviceModelV1 = z.infer<typeof base_device_model_v1>
94
+
95
+ export const device_model_v1 = base_device_model_v1.and(
96
+ device_model_category_specific_properties,
97
+ )
98
+
99
+ export type DeviceModelV1 = z.infer<typeof device_model_v1>
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod'
2
+
3
+ export const image_reference = z.object({
4
+ url: z.string().url(),
5
+ width: z.number(),
6
+ height: z.number(),
7
+ })
8
+
9
+ export type ImageReference = z.infer<typeof image_reference>
@@ -0,0 +1,4 @@
1
+ export * from './device-model-v0.js'
2
+ export * from './device-model-v1.js'
3
+ export * from './image-reference.js'
4
+ export * from './manufacturer.js'
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod'
2
+
3
+ import { image_reference } from './image-reference.js'
4
+
5
+ export const manufacturer = z.object({
6
+ manufacturer_id: z.string().uuid(),
7
+ display_name: z.string(),
8
+ logo: image_reference.optional(),
9
+ integration: z.enum(['stable', 'beta', 'planned', 'unsupported']),
10
+ is_connect_webview_supported: z.boolean(),
11
+ requires_seam_support_to_add_account: z.boolean(),
12
+ })
13
+
14
+ export type Manufacturer = z.infer<typeof manufacturer>