@shepherdjerred/home-assistant 0.1.0-dev.14474

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 (73) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +674 -0
  3. package/README.md +126 -0
  4. package/demos/codegen-fixture.cast +40 -0
  5. package/demos/home-assistant-fixture.json +33 -0
  6. package/demos/record-codegen-demo.sh +119 -0
  7. package/dist/codegen/cli.d.ts +3 -0
  8. package/dist/codegen/cli.d.ts.map +1 -0
  9. package/dist/codegen/cli.js +118 -0
  10. package/dist/codegen/cli.js.map +1 -0
  11. package/dist/codegen/emit.d.ts +8 -0
  12. package/dist/codegen/emit.d.ts.map +1 -0
  13. package/dist/codegen/emit.js +143 -0
  14. package/dist/codegen/emit.js.map +1 -0
  15. package/dist/codegen/introspect.d.ts +193 -0
  16. package/dist/codegen/introspect.d.ts.map +1 -0
  17. package/dist/codegen/introspect.js +131 -0
  18. package/dist/codegen/introspect.js.map +1 -0
  19. package/dist/codegen/known-events.d.ts +10 -0
  20. package/dist/codegen/known-events.d.ts.map +1 -0
  21. package/dist/codegen/known-events.js +25 -0
  22. package/dist/codegen/known-events.js.map +1 -0
  23. package/dist/codegen/selector-to-ts.d.ts +15 -0
  24. package/dist/codegen/selector-to-ts.d.ts.map +1 -0
  25. package/dist/codegen/selector-to-ts.js +110 -0
  26. package/dist/codegen/selector-to-ts.js.map +1 -0
  27. package/dist/index.d.ts +14 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +7 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/rest/client.d.ts +34 -0
  32. package/dist/rest/client.d.ts.map +1 -0
  33. package/dist/rest/client.js +112 -0
  34. package/dist/rest/client.js.map +1 -0
  35. package/dist/rest/errors.d.ts +12 -0
  36. package/dist/rest/errors.d.ts.map +1 -0
  37. package/dist/rest/errors.js +23 -0
  38. package/dist/rest/errors.js.map +1 -0
  39. package/dist/rest/schemas.d.ts +124 -0
  40. package/dist/rest/schemas.d.ts.map +1 -0
  41. package/dist/rest/schemas.js +64 -0
  42. package/dist/rest/schemas.js.map +1 -0
  43. package/dist/schema/types.d.ts +138 -0
  44. package/dist/schema/types.d.ts.map +1 -0
  45. package/dist/schema/types.js +12 -0
  46. package/dist/schema/types.js.map +1 -0
  47. package/dist/shared/config.d.ts +6 -0
  48. package/dist/shared/config.d.ts.map +1 -0
  49. package/dist/shared/config.js +4 -0
  50. package/dist/shared/config.js.map +1 -0
  51. package/dist/ws/client.d.ts +58 -0
  52. package/dist/ws/client.d.ts.map +1 -0
  53. package/dist/ws/client.js +343 -0
  54. package/dist/ws/client.js.map +1 -0
  55. package/dist/ws/errors.d.ts +14 -0
  56. package/dist/ws/errors.d.ts.map +1 -0
  57. package/dist/ws/errors.js +27 -0
  58. package/dist/ws/errors.js.map +1 -0
  59. package/dist/ws/messages.d.ts +130 -0
  60. package/dist/ws/messages.d.ts.map +1 -0
  61. package/dist/ws/messages.js +79 -0
  62. package/dist/ws/messages.js.map +1 -0
  63. package/dist/ws/socket-helpers.d.ts +23 -0
  64. package/dist/ws/socket-helpers.d.ts.map +1 -0
  65. package/dist/ws/socket-helpers.js +73 -0
  66. package/dist/ws/socket-helpers.js.map +1 -0
  67. package/dist/ws/subscriptions.d.ts +37 -0
  68. package/dist/ws/subscriptions.d.ts.map +1 -0
  69. package/dist/ws/subscriptions.js +58 -0
  70. package/dist/ws/subscriptions.js.map +1 -0
  71. package/examples/basic-client.mjs +18 -0
  72. package/examples/codegen-fixture.mjs +95 -0
  73. package/package.json +69 -0
@@ -0,0 +1,112 @@
1
+ import { z } from "zod";
2
+ import { normalizeBaseUrl } from "../shared/config.js";
3
+ import { HaApiError, HaAuthError, HaNotFoundError } from "./errors.js";
4
+ import { EntityState, ConfigEntryDiagnostics, FireEventResponse, HaConfig, HistoryResponse, ServiceCallResult, } from "./schemas.js";
5
+ const RawJson = z.unknown();
6
+ export class HomeAssistantRestClient {
7
+ baseUrl;
8
+ token;
9
+ constructor(config) {
10
+ this.baseUrl = normalizeBaseUrl(config.baseUrl);
11
+ this.token = config.token;
12
+ }
13
+ async getConfig() {
14
+ const body = await this.request("GET", "/api/config");
15
+ return HaConfig.parse(body);
16
+ }
17
+ async getStates() {
18
+ const body = await this.request("GET", "/api/states");
19
+ return z.array(EntityState).parse(body);
20
+ }
21
+ async getState(entityId) {
22
+ const schema = EntityState.extend({ entity_id: z.literal(entityId) });
23
+ const body = await this.request("GET", `/api/states/${encodeURIComponent(entityId)}`, { notFoundResource: entityId });
24
+ return schema.parse(body);
25
+ }
26
+ async callService(domain, service, data, options) {
27
+ const path = this.buildServicePath(domain, service, options);
28
+ const body = await this.request("POST", path, {
29
+ body: data ?? {},
30
+ });
31
+ return ServiceCallResult.parse(body);
32
+ }
33
+ async fireEvent(eventType, data) {
34
+ const body = await this.request("POST", `/api/events/${encodeURIComponent(eventType)}`, { body: data ?? {} });
35
+ return FireEventResponse.parse(body);
36
+ }
37
+ async renderTemplate(template) {
38
+ const response = await this.rawRequest("POST", "/api/template", {
39
+ template,
40
+ });
41
+ await this.assertOk(response, "POST", "/api/template");
42
+ return response.text();
43
+ }
44
+ async getHistory(entityIds, options = {}) {
45
+ const start = options.start ?? new Date(Date.now() - 24 * 60 * 60 * 1000);
46
+ const params = new URLSearchParams();
47
+ params.set("filter_entity_id", entityIds.join(","));
48
+ if (options.end !== undefined) {
49
+ params.set("end_time", options.end.toISOString());
50
+ }
51
+ if (options.minimalResponse === true) {
52
+ params.set("minimal_response", "true");
53
+ }
54
+ if (options.noAttributes === true) {
55
+ params.set("no_attributes", "true");
56
+ }
57
+ if (options.significantChangesOnly === true) {
58
+ params.set("significant_changes_only", "true");
59
+ }
60
+ const path = `/api/history/period/${start.toISOString()}?${params.toString()}`;
61
+ const body = await this.request("GET", path);
62
+ return HistoryResponse.parse(body);
63
+ }
64
+ async getConfigEntryDiagnostics(configEntryId, dataSchema) {
65
+ const path = `/api/diagnostics/config_entry/${encodeURIComponent(configEntryId)}`;
66
+ const body = ConfigEntryDiagnostics.parse(await this.request("GET", path));
67
+ return dataSchema.parse(body.data);
68
+ }
69
+ buildServicePath(domain, service, options) {
70
+ const base = `/api/services/${encodeURIComponent(domain)}/${encodeURIComponent(service)}`;
71
+ if (options?.returnResponse === true) {
72
+ return `${base}?return_response`;
73
+ }
74
+ return base;
75
+ }
76
+ async request(method, path, options = {}) {
77
+ const response = await this.rawRequest(method, path, options.body);
78
+ await this.assertOk(response, method, path, options.notFoundResource);
79
+ const text = await response.text();
80
+ if (text === "") {
81
+ return undefined;
82
+ }
83
+ return RawJson.parse(JSON.parse(text));
84
+ }
85
+ async assertOk(response, method, path, notFoundResource) {
86
+ if (response.status === 401 || response.status === 403) {
87
+ const text = await response.text();
88
+ throw new HaAuthError(response.status, text);
89
+ }
90
+ if (response.status === 404) {
91
+ const text = await response.text();
92
+ throw new HaNotFoundError(notFoundResource ?? path, text);
93
+ }
94
+ if (!response.ok) {
95
+ const text = await response.text();
96
+ throw new HaApiError(`Home Assistant ${method} ${path} failed: ${String(response.status)} ${response.statusText}`, response.status, text);
97
+ }
98
+ }
99
+ rawRequest(method, path, body) {
100
+ const url = `${this.baseUrl}${path}`;
101
+ const headers = {
102
+ Authorization: `Bearer ${this.token}`,
103
+ };
104
+ const init = { method, headers };
105
+ if (method === "POST") {
106
+ headers["Content-Type"] = "application/json";
107
+ init.body = JSON.stringify(body ?? {});
108
+ }
109
+ return fetch(url, init);
110
+ }
111
+ }
112
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/rest/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare class HaApiError extends Error {
2
+ readonly status: number;
3
+ readonly body: string;
4
+ constructor(message: string, status: number, body: string);
5
+ }
6
+ export declare class HaAuthError extends HaApiError {
7
+ constructor(status: number, body: string);
8
+ }
9
+ export declare class HaNotFoundError extends HaApiError {
10
+ constructor(resource: string, body: string);
11
+ }
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/rest/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;IACnC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,YAAmB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAK/D;CACF;AAED,qBAAa,WAAY,SAAQ,UAAU;IACzC,YAAmB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAO9C;CACF;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,YAAmB,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAGhD;CACF"}
@@ -0,0 +1,23 @@
1
+ export class HaApiError extends Error {
2
+ status;
3
+ body;
4
+ constructor(message, status, body) {
5
+ super(message);
6
+ this.name = "HaApiError";
7
+ this.status = status;
8
+ this.body = body;
9
+ }
10
+ }
11
+ export class HaAuthError extends HaApiError {
12
+ constructor(status, body) {
13
+ super(`Home Assistant rejected the access token (${String(status)})`, status, body);
14
+ this.name = "HaAuthError";
15
+ }
16
+ }
17
+ export class HaNotFoundError extends HaApiError {
18
+ constructor(resource, body) {
19
+ super(`Home Assistant resource not found: ${resource}`, 404, body);
20
+ this.name = "HaNotFoundError";
21
+ }
22
+ }
23
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/rest/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,MAAM,CAAS;IACf,IAAI,CAAS;IAE7B,YAAmB,OAAe,EAAE,MAAc,EAAE,IAAY;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC,YAAmB,MAAc,EAAE,IAAY;QAC7C,KAAK,CACH,6CAA6C,MAAM,CAAC,MAAM,CAAC,GAAG,EAC9D,MAAM,EACN,IAAI,CACL,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAmB,QAAgB,EAAE,IAAY;QAC/C,KAAK,CAAC,sCAAsC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,124 @@
1
+ import { z } from "zod";
2
+ export declare const EntityState: z.ZodObject<{
3
+ entity_id: z.ZodString;
4
+ state: z.ZodString;
5
+ attributes: z.ZodRecord<z.ZodString, z.ZodUnknown>;
6
+ last_changed: z.ZodOptional<z.ZodString>;
7
+ last_updated: z.ZodOptional<z.ZodString>;
8
+ last_reported: z.ZodOptional<z.ZodString>;
9
+ context: z.ZodOptional<z.ZodObject<{
10
+ id: z.ZodString;
11
+ parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
12
+ user_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
13
+ }, z.core.$strip>>;
14
+ }, z.core.$strip>;
15
+ export type EntityState = z.infer<typeof EntityState>;
16
+ export declare const HaConfig: z.ZodObject<{
17
+ location_name: z.ZodString;
18
+ latitude: z.ZodNumber;
19
+ longitude: z.ZodNumber;
20
+ elevation: z.ZodNumber;
21
+ time_zone: z.ZodString;
22
+ version: z.ZodString;
23
+ components: z.ZodArray<z.ZodString>;
24
+ unit_system: z.ZodRecord<z.ZodString, z.ZodString>;
25
+ }, z.core.$loose>;
26
+ export type HaConfig = z.infer<typeof HaConfig>;
27
+ /**
28
+ * Default POST /api/services/{domain}/{service} response: a list of entity
29
+ * states that changed as a result of the call.
30
+ */
31
+ export declare const ServiceCallChangedStates: z.ZodArray<z.ZodObject<{
32
+ entity_id: z.ZodString;
33
+ state: z.ZodString;
34
+ attributes: z.ZodRecord<z.ZodString, z.ZodUnknown>;
35
+ last_changed: z.ZodOptional<z.ZodString>;
36
+ last_updated: z.ZodOptional<z.ZodString>;
37
+ last_reported: z.ZodOptional<z.ZodString>;
38
+ context: z.ZodOptional<z.ZodObject<{
39
+ id: z.ZodString;
40
+ parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
41
+ user_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>>;
44
+ export type ServiceCallChangedStates = z.infer<typeof ServiceCallChangedStates>;
45
+ /**
46
+ * Response shape when the request includes `?return_response`. Home Assistant
47
+ * returns an object with `service_response` (service-provided payload) and
48
+ * optionally `changed_states`. We keep the schema `.loose()` so additional
49
+ * top-level fields HA may add in future versions don't break parsing.
50
+ */
51
+ export declare const ServiceCallWithResponse: z.ZodObject<{
52
+ service_response: z.ZodUnknown;
53
+ changed_states: z.ZodOptional<z.ZodArray<z.ZodObject<{
54
+ entity_id: z.ZodString;
55
+ state: z.ZodString;
56
+ attributes: z.ZodRecord<z.ZodString, z.ZodUnknown>;
57
+ last_changed: z.ZodOptional<z.ZodString>;
58
+ last_updated: z.ZodOptional<z.ZodString>;
59
+ last_reported: z.ZodOptional<z.ZodString>;
60
+ context: z.ZodOptional<z.ZodObject<{
61
+ id: z.ZodString;
62
+ parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
63
+ user_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
64
+ }, z.core.$strip>>;
65
+ }, z.core.$strip>>>;
66
+ }, z.core.$loose>;
67
+ export type ServiceCallWithResponse = z.infer<typeof ServiceCallWithResponse>;
68
+ export declare const ServiceCallResult: z.ZodUnion<readonly [z.ZodArray<z.ZodObject<{
69
+ entity_id: z.ZodString;
70
+ state: z.ZodString;
71
+ attributes: z.ZodRecord<z.ZodString, z.ZodUnknown>;
72
+ last_changed: z.ZodOptional<z.ZodString>;
73
+ last_updated: z.ZodOptional<z.ZodString>;
74
+ last_reported: z.ZodOptional<z.ZodString>;
75
+ context: z.ZodOptional<z.ZodObject<{
76
+ id: z.ZodString;
77
+ parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
78
+ user_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
79
+ }, z.core.$strip>>;
80
+ }, z.core.$strip>>, z.ZodObject<{
81
+ service_response: z.ZodUnknown;
82
+ changed_states: z.ZodOptional<z.ZodArray<z.ZodObject<{
83
+ entity_id: z.ZodString;
84
+ state: z.ZodString;
85
+ attributes: z.ZodRecord<z.ZodString, z.ZodUnknown>;
86
+ last_changed: z.ZodOptional<z.ZodString>;
87
+ last_updated: z.ZodOptional<z.ZodString>;
88
+ last_reported: z.ZodOptional<z.ZodString>;
89
+ context: z.ZodOptional<z.ZodObject<{
90
+ id: z.ZodString;
91
+ parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
92
+ user_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
93
+ }, z.core.$strip>>;
94
+ }, z.core.$strip>>>;
95
+ }, z.core.$loose>]>;
96
+ export type ServiceCallResult = z.infer<typeof ServiceCallResult>;
97
+ export declare const FireEventResponse: z.ZodObject<{
98
+ message: z.ZodString;
99
+ }, z.core.$strip>;
100
+ export type FireEventResponse = z.infer<typeof FireEventResponse>;
101
+ export declare const HistoryResponse: z.ZodArray<z.ZodArray<z.ZodObject<{
102
+ entity_id: z.ZodString;
103
+ state: z.ZodString;
104
+ attributes: z.ZodRecord<z.ZodString, z.ZodUnknown>;
105
+ last_changed: z.ZodOptional<z.ZodString>;
106
+ last_updated: z.ZodOptional<z.ZodString>;
107
+ last_reported: z.ZodOptional<z.ZodString>;
108
+ context: z.ZodOptional<z.ZodObject<{
109
+ id: z.ZodString;
110
+ parent_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
111
+ user_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
112
+ }, z.core.$strip>>;
113
+ }, z.core.$strip>>>;
114
+ export type HistoryResponse = z.infer<typeof HistoryResponse>;
115
+ export declare const ConfigEntryDiagnostics: z.ZodObject<{
116
+ home_assistant: z.ZodRecord<z.ZodString, z.ZodUnknown>;
117
+ custom_components: z.ZodRecord<z.ZodString, z.ZodUnknown>;
118
+ integration_manifest: z.ZodRecord<z.ZodString, z.ZodUnknown>;
119
+ setup_times: z.ZodRecord<z.ZodString, z.ZodUnknown>;
120
+ data: z.ZodUnknown;
121
+ issues: z.ZodArray<z.ZodUnknown>;
122
+ }, z.core.$loose>;
123
+ export type ConfigEntryDiagnostics = z.infer<typeof ConfigEntryDiagnostics>;
124
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/rest/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,WAAW;;;;;;;;;;;;iBActB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,QAAQ;;;;;;;;;iBAWX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;kBAAuB,CAAC;AAE7D,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;iBAK1B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAG5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,eAAe;;;;;;;;;;;;mBAAgC,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB;;;;;;;iBASzB,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { z } from "zod";
2
+ export const EntityState = z.object({
3
+ entity_id: z.string(),
4
+ state: z.string(),
5
+ attributes: z.record(z.string(), z.unknown()),
6
+ last_changed: z.string().optional(),
7
+ last_updated: z.string().optional(),
8
+ last_reported: z.string().optional(),
9
+ context: z
10
+ .object({
11
+ id: z.string(),
12
+ parent_id: z.string().nullable().optional(),
13
+ user_id: z.string().nullable().optional(),
14
+ })
15
+ .optional(),
16
+ });
17
+ export const HaConfig = z
18
+ .object({
19
+ location_name: z.string(),
20
+ latitude: z.number(),
21
+ longitude: z.number(),
22
+ elevation: z.number(),
23
+ time_zone: z.string(),
24
+ version: z.string(),
25
+ components: z.array(z.string()),
26
+ unit_system: z.record(z.string(), z.string()),
27
+ })
28
+ .loose();
29
+ /**
30
+ * Default POST /api/services/{domain}/{service} response: a list of entity
31
+ * states that changed as a result of the call.
32
+ */
33
+ export const ServiceCallChangedStates = z.array(EntityState);
34
+ /**
35
+ * Response shape when the request includes `?return_response`. Home Assistant
36
+ * returns an object with `service_response` (service-provided payload) and
37
+ * optionally `changed_states`. We keep the schema `.loose()` so additional
38
+ * top-level fields HA may add in future versions don't break parsing.
39
+ */
40
+ export const ServiceCallWithResponse = z
41
+ .object({
42
+ service_response: z.unknown(),
43
+ changed_states: z.array(EntityState).optional(),
44
+ })
45
+ .loose();
46
+ export const ServiceCallResult = z.union([
47
+ ServiceCallChangedStates,
48
+ ServiceCallWithResponse,
49
+ ]);
50
+ export const FireEventResponse = z.object({
51
+ message: z.string(),
52
+ });
53
+ export const HistoryResponse = z.array(z.array(EntityState));
54
+ export const ConfigEntryDiagnostics = z
55
+ .object({
56
+ home_assistant: z.record(z.string(), z.unknown()),
57
+ custom_components: z.record(z.string(), z.unknown()),
58
+ integration_manifest: z.record(z.string(), z.unknown()),
59
+ setup_times: z.record(z.string(), z.unknown()),
60
+ data: z.unknown(),
61
+ issues: z.array(z.unknown()),
62
+ })
63
+ .loose();
64
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/rest/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Type-level schema describing a specific Home Assistant instance's entities,
3
+ * services, and events. Generated by the `ha-codegen` CLI (see src/codegen/)
4
+ * from a live HA instance. Consumers parameterize the client classes with
5
+ * their generated schema to get literal-union autocomplete and compile-time
6
+ * rejection of unknown entity IDs, domains, services, or event types.
7
+ *
8
+ * The default schema (`DefaultHaSchema`) keeps the original loose behavior so
9
+ * call sites that don't supply a schema see no type changes.
10
+ */
11
+ export type HaFieldType = "number" | "string" | "boolean" | "entity" | "object" | "unknown";
12
+ export type HaServiceFieldMeta = {
13
+ readonly type: HaFieldType;
14
+ readonly required?: boolean;
15
+ /** For `type: "entity"` fields: narrow to entity IDs whose domain matches. */
16
+ readonly domain?: string;
17
+ /** For select-style fields, the allowed literal values. */
18
+ readonly options?: readonly string[];
19
+ };
20
+ export type HaServiceMeta = {
21
+ readonly fields: Readonly<Record<string, HaServiceFieldMeta>>;
22
+ readonly target?: {
23
+ readonly domain: string;
24
+ } | undefined;
25
+ readonly response?: boolean;
26
+ };
27
+ export type HaEntityMeta = {
28
+ readonly domain: string;
29
+ readonly attributes: Readonly<Record<string, unknown>>;
30
+ };
31
+ export type HaSchema = {
32
+ entities: Readonly<Record<string, HaEntityMeta>>;
33
+ services: Readonly<Record<string, Readonly<Record<string, HaServiceMeta>>>>;
34
+ events: string;
35
+ eventData: Readonly<Record<string, unknown>>;
36
+ };
37
+ /**
38
+ * Loose default used when no schema is supplied. Accepts any string for
39
+ * entity IDs / domains / services / events and `Record<string, unknown>` for
40
+ * service data — matching the pre-typed behavior.
41
+ */
42
+ export type DefaultHaSchema = {
43
+ entities: Record<string, HaEntityMeta>;
44
+ services: Record<string, Record<string, HaServiceMeta>>;
45
+ events: string;
46
+ eventData: Record<string, unknown>;
47
+ };
48
+ type StringKeys<T> = Extract<keyof T, string>;
49
+ /** Entity IDs registered in `S` (all of them if `S` is the default schema). */
50
+ export type EntityId<S extends HaSchema> = StringKeys<S["entities"]>;
51
+ /**
52
+ * Entity IDs whose domain is `D`. Narrowed when the schema has literal domains.
53
+ *
54
+ * For the loose {@link DefaultHaSchema} (entities keyed by `string` rather
55
+ * than literal IDs), no literal can extend the requested domain, so the
56
+ * mapped lookup collapses to `never`. Fall back to `EntityId<S>` in that
57
+ * case so stub-typed workflows still accept domain-prefixed literals.
58
+ */
59
+ export type EntityIdByDomain<S extends HaSchema, D extends string> = string extends StringKeys<S["entities"]> ? EntityId<S> : {
60
+ [E in keyof S["entities"]]: S["entities"][E] extends {
61
+ domain: infer DD;
62
+ } ? DD extends D ? E : never : never;
63
+ }[keyof S["entities"]] & string;
64
+ /** Valid domain names registered in `S`. */
65
+ export type Domain<S extends HaSchema> = StringKeys<S["services"]>;
66
+ /** Valid service names registered under domain `D` in `S`. */
67
+ export type Service<S extends HaSchema, D extends Domain<S>> = StringKeys<S["services"][D]>;
68
+ /** Valid event types registered in `S`. */
69
+ export type EventType<S extends HaSchema> = S["events"] & string;
70
+ /** Translate a schema field meta to the TS type accepted in service data. */
71
+ type FieldType<S extends HaSchema, F extends HaServiceFieldMeta> = F["type"] extends "number" ? number : F["type"] extends "string" ? string : F["type"] extends "boolean" ? boolean : F["type"] extends "entity" ? F["domain"] extends string ? EntityIdByDomain<S, F["domain"]> | readonly EntityIdByDomain<S, F["domain"]>[] : EntityId<S> | readonly EntityId<S>[] : F["type"] extends "object" ? Record<string, unknown> : unknown;
72
+ type RequiredFieldKeys<Fields extends Record<string, HaServiceFieldMeta>> = {
73
+ [K in keyof Fields]: Fields[K]["required"] extends true ? K : never;
74
+ }[keyof Fields];
75
+ type OptionalFieldKeys<Fields extends Record<string, HaServiceFieldMeta>> = {
76
+ [K in keyof Fields]: Fields[K]["required"] extends true ? never : K;
77
+ }[keyof Fields];
78
+ type FieldsAsObject<S extends HaSchema, Fields extends Record<string, HaServiceFieldMeta>> = {
79
+ [K in RequiredFieldKeys<Fields>]: FieldType<S, Fields[K]>;
80
+ } & {
81
+ [K in OptionalFieldKeys<Fields>]?: FieldType<S, Fields[K]>;
82
+ };
83
+ type TargetPart<S extends HaSchema, T> = T extends {
84
+ domain: infer TD extends string;
85
+ } ? {
86
+ entity_id?: EntityIdByDomain<S, TD> | readonly EntityIdByDomain<S, TD>[];
87
+ } : {
88
+ entity_id?: EntityId<S> | readonly EntityId<S>[];
89
+ };
90
+ /**
91
+ * Payload accepted by `callService(domain, service, ...)`. Includes:
92
+ * - the generated field shape for this service
93
+ * - an optional `entity_id` narrowed to same-domain entities when the service
94
+ * declares a target selector (falls back to any entity ID when it doesn't)
95
+ */
96
+ export type ServiceDataFor<S extends HaSchema, D extends Domain<S>, V extends Service<S, D>> = S["services"][D][V] extends HaServiceMeta ? FieldsAsObject<S, S["services"][D][V]["fields"]> & TargetPart<S, S["services"][D][V]["target"]> : never;
97
+ /** Per-event data shape if the schema provides one, else `unknown`. */
98
+ export type EventDataFor<S extends HaSchema, E extends EventType<S>> = E extends keyof S["eventData"] ? S["eventData"][E] : unknown;
99
+ /**
100
+ * Typed attribute shape for an entity when the schema lists it. Attributes
101
+ * in HA are fluid so we keep this as a partial of the observed snapshot plus
102
+ * an open index signature rather than pretending to be exhaustive.
103
+ */
104
+ export type EntityAttributesFor<S extends HaSchema, E extends EntityId<S>> = S["entities"][E] extends {
105
+ attributes: infer A;
106
+ } ? Partial<A> & Record<string, unknown> : Record<string, unknown>;
107
+ /**
108
+ * Structural shape of an EntityState response (parallel to the Zod-inferred
109
+ * `EntityState` from rest/schemas.ts) with the entity_id narrowed to a
110
+ * specific literal and attributes typed per schema.
111
+ */
112
+ export type EntityStateFor<S extends HaSchema, E extends EntityId<S>> = {
113
+ entity_id: E;
114
+ state: string;
115
+ attributes: EntityAttributesFor<S, E>;
116
+ last_changed?: string;
117
+ last_updated?: string;
118
+ last_reported?: string;
119
+ context?: {
120
+ id: string;
121
+ parent_id?: string | null;
122
+ user_id?: string | null;
123
+ };
124
+ };
125
+ /**
126
+ * Structural shape of an EventEnvelope with the event data narrowed per
127
+ * schema. Parallel to the Zod-inferred `EventEnvelope` from ws/messages.ts.
128
+ */
129
+ export type EventEnvelopeFor<S extends HaSchema, E extends EventType<S>> = {
130
+ data?: EventDataFor<S, E> extends Record<string, unknown> ? EventDataFor<S, E> : Record<string, unknown>;
131
+ event_type?: E;
132
+ time_fired?: string;
133
+ origin?: string;
134
+ context?: Record<string, unknown>;
135
+ variables?: Record<string, unknown>;
136
+ };
137
+ export {};
138
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Type-level schema describing a specific Home Assistant instance's entities,
3
+ * services, and events. Generated by the `ha-codegen` CLI (see src/codegen/)
4
+ * from a live HA instance. Consumers parameterize the client classes with
5
+ * their generated schema to get literal-union autocomplete and compile-time
6
+ * rejection of unknown entity IDs, domains, services, or event types.
7
+ *
8
+ * The default schema (`DefaultHaSchema`) keeps the original loose behavior so
9
+ * call sites that don't supply a schema see no type changes.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,6 @@
1
+ export type HomeAssistantConfig = {
2
+ baseUrl: string;
3
+ token: string;
4
+ };
5
+ export declare function normalizeBaseUrl(baseUrl: string): string;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -0,0 +1,4 @@
1
+ export function normalizeBaseUrl(baseUrl) {
2
+ return baseUrl.replace(/\/+$/u, "");
3
+ }
4
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { EntityState } from "../rest/schemas.js";
2
+ import type { DefaultHaSchema, Domain, EventType, HaSchema, Service, ServiceDataFor } from "../schema/types.js";
3
+ import type { HomeAssistantConfig } from "../shared/config.js";
4
+ import type { EntityRegistryEntry as EntityRegistryEntryType } from "./messages.js";
5
+ import type { WebSocketLikeCtor } from "./socket-helpers.js";
6
+ import type { EventHandler } from "./subscriptions.js";
7
+ export type HomeAssistantEventClientOptions = {
8
+ reconnect?: boolean;
9
+ initialReconnectDelayMs?: number;
10
+ maxReconnectDelayMs?: number;
11
+ pingIntervalMs?: number;
12
+ webSocketImpl?: WebSocketLikeCtor;
13
+ };
14
+ type ConnectionState = "idle" | "connecting" | "authenticated" | "closed" | "error";
15
+ export type ConnectionStateListener = (state: ConnectionState, detail?: unknown) => void;
16
+ export declare class HomeAssistantEventClient<S extends HaSchema = DefaultHaSchema> {
17
+ private readonly wsUrl;
18
+ private readonly token;
19
+ private readonly opts;
20
+ private readonly webSocketImpl;
21
+ private readonly subscriptions;
22
+ private readonly pending;
23
+ private readonly stateListeners;
24
+ private socket;
25
+ private nextId;
26
+ private closedByUser;
27
+ private reconnectAttempt;
28
+ private pingTimer;
29
+ constructor(config: HomeAssistantConfig, options?: HomeAssistantEventClientOptions);
30
+ onConnectionChange(listener: ConnectionStateListener): () => void;
31
+ connect(): Promise<void>;
32
+ close(): Promise<void>;
33
+ subscribeEvents(eventType: EventType<S>, handler: EventHandler): Promise<() => Promise<void>>;
34
+ subscribeTrigger(trigger: Record<string, unknown>, handler: EventHandler): Promise<() => Promise<void>>;
35
+ callService<D extends Domain<S>, V extends Service<S, D>>(domain: D, service: V, data?: ServiceDataFor<S, D, V>, target?: Record<string, unknown>): Promise<unknown>;
36
+ getStates(): Promise<EntityState[]>;
37
+ getEntityRegistry(): Promise<EntityRegistryEntryType[]>;
38
+ private openAndAuth;
39
+ private attachMessageHandler;
40
+ private attachCloseHandler;
41
+ private handleRawMessage;
42
+ private dispatchEvent;
43
+ private dispatchResult;
44
+ private performAuth;
45
+ private resubscribeAll;
46
+ private subscribeOnServer;
47
+ private unsubscribe;
48
+ private sendRequest;
49
+ private requireOpenSocket;
50
+ private scheduleReconnect;
51
+ private startPingTimer;
52
+ private stopPingTimer;
53
+ private failAllPending;
54
+ private setState;
55
+ private emitError;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ws/client.ts"],"names":[],"mappings":"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"}