@digital-alchemy/hass 25.10.26 → 25.10.27-beta.1

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 (53) hide show
  1. package/dist/dev/mappings.d.mts +28 -0
  2. package/dist/hass.module.d.mts +6 -1
  3. package/dist/hass.module.mjs +6 -1
  4. package/dist/hass.module.mjs.map +1 -1
  5. package/dist/helpers/addon.d.mts +20 -0
  6. package/dist/helpers/addon.mjs +2 -0
  7. package/dist/helpers/addon.mjs.map +1 -0
  8. package/dist/helpers/countries.d.mts +2 -0
  9. package/dist/helpers/countries.mjs +254 -0
  10. package/dist/helpers/countries.mjs.map +1 -0
  11. package/dist/helpers/frontend.d.mts +19 -0
  12. package/dist/helpers/frontend.mjs +2 -0
  13. package/dist/helpers/frontend.mjs.map +1 -0
  14. package/dist/helpers/index.d.mts +4 -0
  15. package/dist/helpers/index.mjs +4 -0
  16. package/dist/helpers/index.mjs.map +1 -1
  17. package/dist/helpers/interfaces.d.mts +8 -1
  18. package/dist/helpers/interfaces.mjs.map +1 -1
  19. package/dist/helpers/languages.d.mts +2 -0
  20. package/dist/helpers/languages.mjs +67 -0
  21. package/dist/helpers/languages.mjs.map +1 -0
  22. package/dist/mock_assistant/mock-assistant.module.d.mts +4 -0
  23. package/dist/services/addon.service.d.mts +3 -0
  24. package/dist/services/addon.service.mjs +15 -0
  25. package/dist/services/addon.service.mjs.map +1 -0
  26. package/dist/services/frontend.service.d.mts +3 -0
  27. package/dist/services/frontend.service.mjs +13 -0
  28. package/dist/services/frontend.service.mjs.map +1 -0
  29. package/dist/services/index.d.mts +2 -0
  30. package/dist/services/index.mjs +2 -0
  31. package/dist/services/index.mjs.map +1 -1
  32. package/dist/testing/addon.spec.d.mts +1 -0
  33. package/dist/testing/addon.spec.mjs +59 -0
  34. package/dist/testing/addon.spec.mjs.map +1 -0
  35. package/dist/testing/frontend.spec.d.mts +1 -0
  36. package/dist/testing/frontend.spec.mjs +60 -0
  37. package/dist/testing/frontend.spec.mjs.map +1 -0
  38. package/dist/user.d.mts +2 -0
  39. package/package.json +1 -1
  40. package/src/dev/mappings.mts +29 -0
  41. package/src/hass.module.mts +9 -0
  42. package/src/helpers/addon.mts +20 -0
  43. package/src/helpers/countries.mts +255 -0
  44. package/src/helpers/frontend.mts +19 -0
  45. package/src/helpers/index.mts +4 -0
  46. package/src/helpers/interfaces.mts +10 -0
  47. package/src/helpers/languages.mts +67 -0
  48. package/src/services/addon.service.mts +19 -0
  49. package/src/services/frontend.service.mts +20 -0
  50. package/src/services/index.mts +2 -0
  51. package/src/testing/addon.spec.mts +65 -0
  52. package/src/testing/frontend.spec.mts +66 -0
  53. package/src/user.mts +4 -0
@@ -1,3 +1,4 @@
1
+ export * from "./addon.service.mjs";
1
2
  export * from "./area.service.mjs";
2
3
  export * from "./backup.service.mjs";
3
4
  export * from "./call-proxy.service.mjs";
@@ -9,6 +10,7 @@ export * from "./events.service.mjs";
9
10
  export * from "./feature.service.mjs";
10
11
  export * from "./fetch-api.service.mjs";
11
12
  export * from "./floor.service.mjs";
13
+ export * from "./frontend.service.mjs";
12
14
  export * from "./id-by.service.mjs";
13
15
  export * from "./internal.service.mjs";
14
16
  export * from "./label.service.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/services/index.mts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/services/index.mts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,59 @@
1
+ import { hassTestRunner } from "../mock_assistant/index.mjs";
2
+ describe("Addon Service", () => {
3
+ afterEach(async () => {
4
+ await hassTestRunner.teardown();
5
+ vi.restoreAllMocks();
6
+ });
7
+ describe("list", () => {
8
+ it("should fetch addon list via supervisor API", async () => {
9
+ expect.assertions(2);
10
+ const mockAddons = [
11
+ {
12
+ advanced: false,
13
+ available: true,
14
+ build: false,
15
+ description: "A test addon",
16
+ detached: false,
17
+ homeassistant: "2024.1.0",
18
+ icon: true,
19
+ logo: false,
20
+ name: "Test Addon",
21
+ repository: "test",
22
+ slug: "test_addon",
23
+ stage: "stable",
24
+ state: "started",
25
+ system_managed: false,
26
+ update_available: false,
27
+ url: "http://test.local",
28
+ version: "1.0.0",
29
+ version_latest: "1.0.0",
30
+ },
31
+ ];
32
+ await hassTestRunner.run(({ lifecycle, hass }) => {
33
+ const spy = vi
34
+ .spyOn(hass.socket, "sendMessage")
35
+ .mockImplementation(async () => ({ addons: mockAddons }));
36
+ lifecycle.onReady(async () => {
37
+ const result = await hass.addon.list();
38
+ expect(spy).toHaveBeenCalledWith({
39
+ endpoint: "/addons",
40
+ method: "get",
41
+ type: "supervisor/api",
42
+ });
43
+ expect(result).toEqual(mockAddons);
44
+ });
45
+ });
46
+ });
47
+ it("should return empty array when no addons are available", async () => {
48
+ expect.assertions(1);
49
+ await hassTestRunner.run(({ lifecycle, hass }) => {
50
+ vi.spyOn(hass.socket, "sendMessage").mockImplementation(async () => ({ addons: [] }));
51
+ lifecycle.onReady(async () => {
52
+ const result = await hass.addon.list();
53
+ expect(result).toEqual([]);
54
+ });
55
+ });
56
+ });
57
+ });
58
+ });
59
+ //# sourceMappingURL=addon.spec.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addon.spec.mjs","sourceRoot":"","sources":["../../src/testing/addon.spec.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC;QAChC,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,UAAU,GAAmB;gBACjC;oBACE,QAAQ,EAAE,KAAK;oBACf,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,KAAK;oBACZ,WAAW,EAAE,cAAc;oBAC3B,QAAQ,EAAE,KAAK;oBACf,aAAa,EAAE,UAAU;oBACzB,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,YAAY;oBAClB,UAAU,EAAE,MAAM;oBAClB,IAAI,EAAE,YAAY;oBAClB,KAAK,EAAE,QAAQ;oBACf,KAAK,EAAE,SAAS;oBAChB,cAAc,EAAE,KAAK;oBACrB,gBAAgB,EAAE,KAAK;oBACvB,GAAG,EAAE,mBAAmB;oBACxB,OAAO,EAAE,OAAO;oBAChB,cAAc,EAAE,OAAO;iBACxB;aACF,CAAC;YAEF,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC/C,MAAM,GAAG,GAAG,EAAE;qBACX,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;qBACjC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBAE5D,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;oBAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBACvC,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC;wBAC/B,QAAQ,EAAE,SAAS;wBACnB,MAAM,EAAE,KAAK;wBACb,IAAI,EAAE,gBAAgB;qBACvB,CAAC,CAAC;oBACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC/C,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAEtF,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;oBAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBACvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ import { hassTestRunner } from "../mock_assistant/index.mjs";
2
+ describe("Frontend Service", () => {
3
+ afterEach(async () => {
4
+ await hassTestRunner.teardown();
5
+ vi.restoreAllMocks();
6
+ });
7
+ describe("getThemes", () => {
8
+ it("should fetch themes and return Record of theme names to definitions", async () => {
9
+ expect.assertions(2);
10
+ const mockThemes = {
11
+ "LCARS Default": {
12
+ "accent-color": "var(--lcars-orange)",
13
+ "card-mod-theme": "LCARS Default",
14
+ "divider-color": "transparent",
15
+ "primary-color": "var(--lcars-ui-tertiary)",
16
+ "sidebar-background-color": "var(--lcars-ui-primary)",
17
+ },
18
+ "Minimal Ninja": {
19
+ "accent-color": "#FFAB00",
20
+ "card-mod-theme": "Minimal Ninja",
21
+ "divider-color": "rgba(145, 158, 171, 0.2)",
22
+ modes: {
23
+ dark: {
24
+ "card-background-color": "#1C252E",
25
+ "primary-text-color": "#ffffff",
26
+ },
27
+ light: {
28
+ "card-background-color": "#ffffff",
29
+ "primary-text-color": "#1C252E",
30
+ },
31
+ },
32
+ "primary-color": "#00A76F",
33
+ },
34
+ };
35
+ await hassTestRunner.run(({ lifecycle, hass }) => {
36
+ const spy = vi
37
+ .spyOn(hass.socket, "sendMessage")
38
+ .mockImplementation(async () => ({ themes: mockThemes }));
39
+ lifecycle.onReady(async () => {
40
+ const result = await hass.frontend.getThemes();
41
+ expect(spy).toHaveBeenCalledWith({
42
+ type: "frontend/get_themes",
43
+ });
44
+ expect(result).toEqual(mockThemes);
45
+ });
46
+ });
47
+ });
48
+ it("should return empty object when no themes are available", async () => {
49
+ expect.assertions(1);
50
+ await hassTestRunner.run(({ lifecycle, hass }) => {
51
+ vi.spyOn(hass.socket, "sendMessage").mockImplementation(async () => ({ themes: {} }));
52
+ lifecycle.onReady(async () => {
53
+ const result = await hass.frontend.getThemes();
54
+ expect(result).toEqual({});
55
+ });
56
+ });
57
+ });
58
+ });
59
+ });
60
+ //# sourceMappingURL=frontend.spec.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.spec.mjs","sourceRoot":"","sources":["../../src/testing/frontend.spec.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC;QAChC,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,UAAU,GAAoC;gBAClD,eAAe,EAAE;oBACf,cAAc,EAAE,qBAAqB;oBACrC,gBAAgB,EAAE,eAAe;oBACjC,eAAe,EAAE,aAAa;oBAC9B,eAAe,EAAE,0BAA0B;oBAC3C,0BAA0B,EAAE,yBAAyB;iBACtD;gBACD,eAAe,EAAE;oBACf,cAAc,EAAE,SAAS;oBACzB,gBAAgB,EAAE,eAAe;oBACjC,eAAe,EAAE,0BAA0B;oBAC3C,KAAK,EAAE;wBACL,IAAI,EAAE;4BACJ,uBAAuB,EAAE,SAAS;4BAClC,oBAAoB,EAAE,SAAS;yBAChC;wBACD,KAAK,EAAE;4BACL,uBAAuB,EAAE,SAAS;4BAClC,oBAAoB,EAAE,SAAS;yBAChC;qBACF;oBACD,eAAe,EAAE,SAAS;iBAC3B;aACF,CAAC;YAEF,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC/C,MAAM,GAAG,GAAG,EAAE;qBACX,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;qBACjC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBAE5D,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;oBAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC;wBAC/B,IAAI,EAAE,qBAAqB;qBAC5B,CAAC,CAAC;oBACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC/C,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAEtF,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;oBAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/user.d.mts CHANGED
@@ -19,6 +19,8 @@ export interface iCallService {
19
19
  }
20
20
  export interface HassZoneMapping {
21
21
  }
22
+ export interface HassThemeMapping {
23
+ }
22
24
  export type TAreaId = UnPrefix<keyof HassAreaMapping>;
23
25
  export type TDeviceId = UnPrefix<keyof HassDeviceMapping>;
24
26
  export type TFloorId = UnPrefix<keyof HassFloorMapping>;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "@digital-alchemy/hass",
4
4
  "repository": "https://github.com/Digital-Alchemy-TS/hass",
5
5
  "homepage": "https://docs.digital-alchemy.app",
6
- "version": "25.10.26",
6
+ "version": "25.10.27-beta.1",
7
7
  "description": "Typescript APIs for Home Assistant. Includes rest & websocket bindings",
8
8
  "scripts": {
9
9
  "build": "rm -rf dist/; tsc",
@@ -163,4 +163,33 @@ declare module "../user.mts" {
163
163
  _downstairs: "switch.kitchen_cabinets" | "switch.living_room_mood_lights";
164
164
  _upstairs: "switch.bedroom_lamp";
165
165
  }
166
+
167
+ export interface HassThemeMapping {
168
+ "(DO NOT USE/MODIFY)=== LCARS variables": true;
169
+ "(DO NOT USE/MODIFY)=== Base customizations": true;
170
+ "(DO NOT USE/MODIFY)=== card-mod CSS": true;
171
+ "LCARS Default": true;
172
+ "LCARS Classic": true;
173
+ "LCARS Nemesis Blue": true;
174
+ "LCARS Lower Decks I": true;
175
+ "LCARS Lower Decks II": true;
176
+ "LCARS Romulus": true;
177
+ "LCARS Kronos": true;
178
+ "LCARS Cardassia": true;
179
+ "LCARS Zeldaar": true;
180
+ "LCARS Modern": true;
181
+ "LCARS Picard I": true;
182
+ "LCARS Picard II": true;
183
+ "LCARS Red Alert": true;
184
+ "LCARS TNG": true;
185
+ "LCARS TNGbuttons": true;
186
+ "LCARS Transporter": true;
187
+ "LCARS Navigation": true;
188
+ "LCARS 25C": true;
189
+ "LCARS 25C (Red Alert)": true;
190
+ "LCARS 25C (Yellow Alert)": true;
191
+ "LCARS 25C (Blue Alert)": true;
192
+ "LCARS Breen": true;
193
+ "Minimal Ninja": "light" | "dark";
194
+ }
166
195
  }
@@ -1,6 +1,7 @@
1
1
  import { CreateLibrary } from "@digital-alchemy/core";
2
2
 
3
3
  import {
4
+ AddonService,
4
5
  Area,
5
6
  Backup,
6
7
  CallProxy,
@@ -11,6 +12,7 @@ import {
11
12
  FetchAPI,
12
13
  FetchInternals,
13
14
  Floor,
15
+ FrontendService,
14
16
  HassDiagnosticsService,
15
17
  HassFeatureService,
16
18
  IDByExtension,
@@ -150,6 +152,8 @@ export const LIB_HASS = CreateLibrary({
150
152
  // no internal dependency ones first
151
153
  priorityInit: ["internals", "fetch", "socket"],
152
154
  services: {
155
+ addon: AddonService,
156
+
153
157
  /**
154
158
  * home assistant areas
155
159
  */
@@ -205,6 +209,11 @@ export const LIB_HASS = CreateLibrary({
205
209
  */
206
210
  floor: Floor,
207
211
 
212
+ /**
213
+ * frontend interactions
214
+ */
215
+ frontend: FrontendService,
216
+
208
217
  /**
209
218
  * search for entity ids in a type safe way
210
219
  */
@@ -0,0 +1,20 @@
1
+ export interface AddonDetails {
2
+ name: string;
3
+ slug: string;
4
+ description: string;
5
+ advanced: boolean;
6
+ stage: string;
7
+ version: string;
8
+ version_latest: string;
9
+ update_available: boolean;
10
+ available: boolean;
11
+ detached: boolean;
12
+ homeassistant: string;
13
+ state: "started" | "stopped" | "error";
14
+ repository: string;
15
+ build: boolean;
16
+ url: string;
17
+ icon: boolean;
18
+ logo: boolean;
19
+ system_managed: boolean;
20
+ }
@@ -0,0 +1,255 @@
1
+ // This is duplicated from a generated file from home assistant core
2
+ // Will only modify this list to match what HA supports
3
+
4
+ export const SUPPORTED_COUNTRIES = [
5
+ "AD",
6
+ "AE",
7
+ "AF",
8
+ "AG",
9
+ "AI",
10
+ "AL",
11
+ "AM",
12
+ "AO",
13
+ "AQ",
14
+ "AR",
15
+ "AS",
16
+ "AT",
17
+ "AU",
18
+ "AW",
19
+ "AX",
20
+ "AZ",
21
+ "BA",
22
+ "BB",
23
+ "BD",
24
+ "BE",
25
+ "BF",
26
+ "BG",
27
+ "BH",
28
+ "BI",
29
+ "BJ",
30
+ "BL",
31
+ "BM",
32
+ "BN",
33
+ "BO",
34
+ "BQ",
35
+ "BR",
36
+ "BS",
37
+ "BT",
38
+ "BV",
39
+ "BW",
40
+ "BY",
41
+ "BZ",
42
+ "CA",
43
+ "CC",
44
+ "CD",
45
+ "CF",
46
+ "CG",
47
+ "CH",
48
+ "CI",
49
+ "CK",
50
+ "CL",
51
+ "CM",
52
+ "CN",
53
+ "CO",
54
+ "CR",
55
+ "CU",
56
+ "CV",
57
+ "CW",
58
+ "CX",
59
+ "CY",
60
+ "CZ",
61
+ "DE",
62
+ "DJ",
63
+ "DK",
64
+ "DM",
65
+ "DO",
66
+ "DZ",
67
+ "EC",
68
+ "EE",
69
+ "EG",
70
+ "EH",
71
+ "ER",
72
+ "ES",
73
+ "ET",
74
+ "FI",
75
+ "FJ",
76
+ "FK",
77
+ "FM",
78
+ "FO",
79
+ "FR",
80
+ "GA",
81
+ "GB",
82
+ "GD",
83
+ "GE",
84
+ "GF",
85
+ "GG",
86
+ "GH",
87
+ "GI",
88
+ "GL",
89
+ "GM",
90
+ "GN",
91
+ "GP",
92
+ "GQ",
93
+ "GR",
94
+ "GS",
95
+ "GT",
96
+ "GU",
97
+ "GW",
98
+ "GY",
99
+ "HK",
100
+ "HM",
101
+ "HN",
102
+ "HR",
103
+ "HT",
104
+ "HU",
105
+ "ID",
106
+ "IE",
107
+ "IL",
108
+ "IM",
109
+ "IN",
110
+ "IO",
111
+ "IQ",
112
+ "IR",
113
+ "IS",
114
+ "IT",
115
+ "JE",
116
+ "JM",
117
+ "JO",
118
+ "JP",
119
+ "KE",
120
+ "KG",
121
+ "KH",
122
+ "KI",
123
+ "KM",
124
+ "KN",
125
+ "KP",
126
+ "KR",
127
+ "KW",
128
+ "KY",
129
+ "KZ",
130
+ "LA",
131
+ "LB",
132
+ "LC",
133
+ "LI",
134
+ "LK",
135
+ "LR",
136
+ "LS",
137
+ "LT",
138
+ "LU",
139
+ "LV",
140
+ "LY",
141
+ "MA",
142
+ "MC",
143
+ "MD",
144
+ "ME",
145
+ "MF",
146
+ "MG",
147
+ "MH",
148
+ "MK",
149
+ "ML",
150
+ "MM",
151
+ "MN",
152
+ "MO",
153
+ "MP",
154
+ "MQ",
155
+ "MR",
156
+ "MS",
157
+ "MT",
158
+ "MU",
159
+ "MV",
160
+ "MW",
161
+ "MX",
162
+ "MY",
163
+ "MZ",
164
+ "NA",
165
+ "NC",
166
+ "NE",
167
+ "NF",
168
+ "NG",
169
+ "NI",
170
+ "NL",
171
+ "NO",
172
+ "NP",
173
+ "NR",
174
+ "NU",
175
+ "NZ",
176
+ "OM",
177
+ "PA",
178
+ "PE",
179
+ "PF",
180
+ "PG",
181
+ "PH",
182
+ "PK",
183
+ "PL",
184
+ "PM",
185
+ "PN",
186
+ "PR",
187
+ "PS",
188
+ "PT",
189
+ "PW",
190
+ "PY",
191
+ "QA",
192
+ "RE",
193
+ "RO",
194
+ "RS",
195
+ "RU",
196
+ "RW",
197
+ "SA",
198
+ "SB",
199
+ "SC",
200
+ "SD",
201
+ "SE",
202
+ "SG",
203
+ "SH",
204
+ "SI",
205
+ "SJ",
206
+ "SK",
207
+ "SL",
208
+ "SM",
209
+ "SN",
210
+ "SO",
211
+ "SR",
212
+ "SS",
213
+ "ST",
214
+ "SV",
215
+ "SX",
216
+ "SY",
217
+ "SZ",
218
+ "TC",
219
+ "TD",
220
+ "TF",
221
+ "TG",
222
+ "TH",
223
+ "TJ",
224
+ "TK",
225
+ "TL",
226
+ "TM",
227
+ "TN",
228
+ "TO",
229
+ "TR",
230
+ "TT",
231
+ "TV",
232
+ "TW",
233
+ "TZ",
234
+ "UA",
235
+ "UG",
236
+ "UM",
237
+ "US",
238
+ "UY",
239
+ "UZ",
240
+ "VA",
241
+ "VC",
242
+ "VE",
243
+ "VG",
244
+ "VI",
245
+ "VN",
246
+ "VU",
247
+ "WF",
248
+ "WS",
249
+ "YE",
250
+ "YT",
251
+ "ZA",
252
+ "ZM",
253
+ "ZW",
254
+ ] as const;
255
+ export type SupportedCountries = (typeof SUPPORTED_COUNTRIES)[number];
@@ -0,0 +1,19 @@
1
+ export interface ThemeDefinition {
2
+ "accent-color"?: string;
3
+ "app-header-background-color"?: string;
4
+ "app-header-edit-background-color"?: string;
5
+ "app-header-text-color"?: string;
6
+ "card-mod-root-yaml"?: string;
7
+ "divider-color"?: string;
8
+ "ha-card-border-radius"?: string;
9
+ "ha-card-border-width"?: string;
10
+ "paper-listbox-background-color"?: string;
11
+ "primary-color"?: string;
12
+ "sidebar-background-color"?: string;
13
+ "sidebar-menu-button-background-color"?: string;
14
+ modes?: {
15
+ light?: Record<string, unknown>;
16
+ dark?: Record<string, unknown>;
17
+ };
18
+ [key: string]: unknown;
19
+ }
@@ -1,12 +1,16 @@
1
+ export * from "./addon.mts";
1
2
  export * from "./backup.mts";
2
3
  export * from "./constants.mts";
4
+ export * from "./countries.mts";
3
5
  export * from "./device.mts";
4
6
  export * from "./entity-state.mts";
5
7
  export * from "./features.mts";
6
8
  export * from "./fetch.mts";
7
9
  export * from "./fetch/index.mts";
10
+ export * from "./frontend.mts";
8
11
  export * from "./id-by.mts";
9
12
  export * from "./interfaces.mts";
13
+ export * from "./languages.mts";
10
14
  export * from "./notify.mts";
11
15
  export * from "./registry.mts";
12
16
  export * from "./supported-features.mts";
@@ -3,9 +3,11 @@ import type EventEmitter from "events";
3
3
  import type { EmptyObject } from "type-fest";
4
4
  import type WS from "ws";
5
5
 
6
+ import type { AddonDetails, ThemeDefinition } from "../index.mts";
6
7
  import type {
7
8
  ALL_DOMAINS,
8
9
  ANY_ENTITY,
10
+ HassThemeMapping,
9
11
  HassUniqueIdMapping,
10
12
  iCallService,
11
13
  PICK_ENTITY,
@@ -49,6 +51,14 @@ import type {
49
51
  SocketSubscribeOptions,
50
52
  } from "./websocket.mts";
51
53
 
54
+ export type HassAddonService = {
55
+ list: () => Promise<AddonDetails[]>;
56
+ };
57
+
58
+ export type HassFrontendService = {
59
+ getThemes: () => Promise<Record<keyof HassThemeMapping, ThemeDefinition>>;
60
+ };
61
+
52
62
  export type HassAreaService = {
53
63
  apply: (
54
64
  area: TAreaId,
@@ -0,0 +1,67 @@
1
+ export const SUPPORTED_LANGUAGES = [
2
+ "af",
3
+ "ar",
4
+ "bg",
5
+ "bn",
6
+ "bs",
7
+ "ca",
8
+ "cs",
9
+ "cy",
10
+ "da",
11
+ "de",
12
+ "el",
13
+ "en",
14
+ "en-GB",
15
+ "eo",
16
+ "es",
17
+ "es-419",
18
+ "et",
19
+ "eu",
20
+ "fa",
21
+ "fi",
22
+ "fr",
23
+ "fy",
24
+ "ga",
25
+ "gl",
26
+ "gsw",
27
+ "he",
28
+ "hi",
29
+ "hr",
30
+ "hu",
31
+ "hy",
32
+ "id",
33
+ "is",
34
+ "it",
35
+ "ja",
36
+ "ka",
37
+ "ko",
38
+ "lb",
39
+ "lt",
40
+ "lv",
41
+ "mk",
42
+ "ml",
43
+ "nb",
44
+ "nl",
45
+ "nn",
46
+ "pl",
47
+ "pt",
48
+ "pt-BR",
49
+ "ro",
50
+ "ru",
51
+ "sk",
52
+ "sl",
53
+ "sq",
54
+ "sr",
55
+ "sr-Latn",
56
+ "sv",
57
+ "ta",
58
+ "te",
59
+ "th",
60
+ "tr",
61
+ "uk",
62
+ "ur",
63
+ "vi",
64
+ "zh-Hans",
65
+ "zh-Hant",
66
+ ];
67
+ export type SupportedLanguages = (typeof SUPPORTED_LANGUAGES)[number];
@@ -0,0 +1,19 @@
1
+ import type { TServiceParams } from "@digital-alchemy/core";
2
+
3
+ import type { AddonDetails, HassAddonService } from "../index.mts";
4
+
5
+ export function AddonService({ hass, logger }: TServiceParams): HassAddonService {
6
+ async function list() {
7
+ logger.trace({ name: "list" }, "fetching addon list");
8
+ const { addons } = await hass.socket.sendMessage<{ addons: AddonDetails[] }>({
9
+ endpoint: "/addons",
10
+ method: "get",
11
+ type: "supervisor/api",
12
+ });
13
+ return addons;
14
+ }
15
+
16
+ return {
17
+ list,
18
+ };
19
+ }