@switchbot/homebridge-switchbot 5.0.0-beta.99 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/.changeset/config.json +14 -0
  2. package/.github/copilot-instructions.md +39 -0
  3. package/.github/workflows/ci.yml +4 -1
  4. package/.github/workflows/manual-e2e.yml +6 -3
  5. package/.github/workflows/release.yml +64 -15
  6. package/.github/workflows/stale.yml +2 -4
  7. package/.husky/pre-push +15 -0
  8. package/CHANGELOG.md +126 -134
  9. package/MIGRATION.md +16 -6
  10. package/README.md +84 -3
  11. package/TODO.md +263 -0
  12. package/config.schema.json +229 -36
  13. package/dist/SwitchBotHAPPlatform.d.ts +133 -0
  14. package/dist/SwitchBotHAPPlatform.d.ts.map +1 -0
  15. package/dist/SwitchBotHAPPlatform.js +555 -0
  16. package/dist/SwitchBotHAPPlatform.js.map +1 -0
  17. package/dist/SwitchBotMatterPlatform.d.ts +141 -0
  18. package/dist/SwitchBotMatterPlatform.d.ts.map +1 -0
  19. package/dist/SwitchBotMatterPlatform.js +536 -0
  20. package/dist/SwitchBotMatterPlatform.js.map +1 -0
  21. package/dist/device-types.d.ts +31 -0
  22. package/dist/device-types.d.ts.map +1 -0
  23. package/dist/device-types.js +246 -0
  24. package/dist/device-types.js.map +1 -0
  25. package/dist/deviceCommandMapper.d.ts +10 -0
  26. package/dist/deviceCommandMapper.d.ts.map +1 -0
  27. package/dist/deviceCommandMapper.js +319 -0
  28. package/dist/deviceCommandMapper.js.map +1 -0
  29. package/dist/deviceFactory.d.ts +3 -2
  30. package/dist/deviceFactory.d.ts.map +1 -1
  31. package/dist/deviceFactory.js +107 -29
  32. package/dist/deviceFactory.js.map +1 -1
  33. package/dist/devices/genericDevice.d.ts +59 -37
  34. package/dist/devices/genericDevice.d.ts.map +1 -1
  35. package/dist/devices/genericDevice.js +376 -78
  36. package/dist/devices/genericDevice.js.map +1 -1
  37. package/dist/errors.d.ts +38 -0
  38. package/dist/errors.d.ts.map +1 -0
  39. package/dist/errors.js +32 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/homebridge-ui/device-types.js +246 -0
  42. package/dist/homebridge-ui/device-types.js.map +1 -0
  43. package/dist/homebridge-ui/deviceCommandMapper.js +319 -0
  44. package/dist/homebridge-ui/deviceCommandMapper.js.map +1 -0
  45. package/dist/homebridge-ui/endpoints/config.d.ts +3 -0
  46. package/dist/homebridge-ui/endpoints/config.d.ts.map +1 -0
  47. package/dist/homebridge-ui/endpoints/config.js +90 -0
  48. package/dist/homebridge-ui/endpoints/config.js.map +1 -0
  49. package/dist/homebridge-ui/endpoints/devices.d.ts +6 -0
  50. package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -0
  51. package/dist/homebridge-ui/endpoints/devices.js +144 -0
  52. package/dist/homebridge-ui/endpoints/devices.js.map +1 -0
  53. package/dist/homebridge-ui/endpoints/discovery.d.ts +7 -0
  54. package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -0
  55. package/dist/homebridge-ui/endpoints/discovery.js +219 -0
  56. package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
  57. package/dist/homebridge-ui/errors.js +32 -0
  58. package/dist/homebridge-ui/errors.js.map +1 -0
  59. package/dist/homebridge-ui/homebridge-ui/endpoints/config.js +90 -0
  60. package/dist/homebridge-ui/homebridge-ui/endpoints/config.js.map +1 -0
  61. package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js +144 -0
  62. package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js.map +1 -0
  63. package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js +219 -0
  64. package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js.map +1 -0
  65. package/dist/homebridge-ui/homebridge-ui/server.js +11 -0
  66. package/dist/homebridge-ui/homebridge-ui/server.js.map +1 -0
  67. package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js +108 -0
  68. package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js.map +1 -0
  69. package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js +111 -0
  70. package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js.map +1 -0
  71. package/dist/homebridge-ui/homebridge-ui/utils/logger.js +17 -0
  72. package/dist/homebridge-ui/homebridge-ui/utils/logger.js.map +1 -0
  73. package/dist/homebridge-ui/public/css/styles.css +483 -0
  74. package/dist/homebridge-ui/public/index.html +197 -621
  75. package/dist/homebridge-ui/public/js/advanced-settings.d.ts +3 -0
  76. package/dist/homebridge-ui/public/js/advanced-settings.d.ts.map +1 -0
  77. package/dist/homebridge-ui/public/js/advanced-settings.js +95 -0
  78. package/dist/homebridge-ui/public/js/advanced-settings.js.map +1 -0
  79. package/dist/homebridge-ui/public/js/advanced-settings.ts +94 -0
  80. package/dist/homebridge-ui/public/js/api.d.ts +66 -0
  81. package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
  82. package/dist/homebridge-ui/public/js/api.js +295 -0
  83. package/dist/homebridge-ui/public/js/api.js.map +1 -0
  84. package/dist/homebridge-ui/public/js/api.ts +355 -0
  85. package/dist/homebridge-ui/public/js/app.d.ts +2 -0
  86. package/dist/homebridge-ui/public/js/app.d.ts.map +1 -0
  87. package/dist/homebridge-ui/public/js/app.js +3722 -0
  88. package/dist/homebridge-ui/public/js/app.js.map +7 -0
  89. package/dist/homebridge-ui/public/js/app.ts +22 -0
  90. package/dist/homebridge-ui/public/js/constants.d.ts +2 -0
  91. package/dist/homebridge-ui/public/js/constants.d.ts.map +1 -0
  92. package/dist/homebridge-ui/public/js/constants.js +2 -0
  93. package/dist/homebridge-ui/public/js/constants.js.map +1 -0
  94. package/dist/homebridge-ui/public/js/constants.ts +1 -0
  95. package/dist/homebridge-ui/public/js/credentials.d.ts +3 -0
  96. package/dist/homebridge-ui/public/js/credentials.d.ts.map +1 -0
  97. package/dist/homebridge-ui/public/js/credentials.js +99 -0
  98. package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
  99. package/dist/homebridge-ui/public/js/credentials.ts +105 -0
  100. package/dist/homebridge-ui/public/js/devices-delete.d.ts +3 -0
  101. package/dist/homebridge-ui/public/js/devices-delete.d.ts.map +1 -0
  102. package/dist/homebridge-ui/public/js/devices-delete.js +199 -0
  103. package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
  104. package/dist/homebridge-ui/public/js/devices-delete.ts +227 -0
  105. package/dist/homebridge-ui/public/js/devices.d.ts +9 -0
  106. package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -0
  107. package/dist/homebridge-ui/public/js/devices.js +98 -0
  108. package/dist/homebridge-ui/public/js/devices.js.map +1 -0
  109. package/dist/homebridge-ui/public/js/devices.ts +106 -0
  110. package/dist/homebridge-ui/public/js/discovery.d.ts +9 -0
  111. package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
  112. package/dist/homebridge-ui/public/js/discovery.js +1201 -0
  113. package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
  114. package/dist/homebridge-ui/public/js/discovery.ts +1335 -0
  115. package/dist/homebridge-ui/public/js/logger.d.ts +7 -0
  116. package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
  117. package/dist/homebridge-ui/public/js/logger.js +17 -0
  118. package/dist/homebridge-ui/public/js/logger.js.map +1 -0
  119. package/dist/homebridge-ui/public/js/logger.ts +17 -0
  120. package/dist/homebridge-ui/public/js/modal.d.ts +5 -0
  121. package/dist/homebridge-ui/public/js/modal.d.ts.map +1 -0
  122. package/dist/homebridge-ui/public/js/modal.js +35 -0
  123. package/dist/homebridge-ui/public/js/modal.js.map +1 -0
  124. package/dist/homebridge-ui/public/js/modal.ts +35 -0
  125. package/dist/homebridge-ui/public/js/modals.d.ts +15 -0
  126. package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
  127. package/dist/homebridge-ui/public/js/modals.js +675 -0
  128. package/dist/homebridge-ui/public/js/modals.js.map +1 -0
  129. package/dist/homebridge-ui/public/js/modals.ts +765 -0
  130. package/dist/homebridge-ui/public/js/render.d.ts +71 -0
  131. package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
  132. package/dist/homebridge-ui/public/js/render.js +960 -0
  133. package/dist/homebridge-ui/public/js/render.js.map +1 -0
  134. package/dist/homebridge-ui/public/js/render.ts +1084 -0
  135. package/dist/homebridge-ui/public/js/toast.d.ts +6 -0
  136. package/dist/homebridge-ui/public/js/toast.d.ts.map +1 -0
  137. package/dist/homebridge-ui/public/js/toast.js +38 -0
  138. package/dist/homebridge-ui/public/js/toast.js.map +1 -0
  139. package/dist/homebridge-ui/public/js/toast.ts +44 -0
  140. package/dist/homebridge-ui/public/js/types.d.ts +23 -0
  141. package/dist/homebridge-ui/public/js/types.d.ts.map +1 -0
  142. package/dist/homebridge-ui/public/js/types.js +2 -0
  143. package/dist/homebridge-ui/public/js/types.js.map +1 -0
  144. package/dist/homebridge-ui/public/js/types.ts +26 -0
  145. package/dist/homebridge-ui/server.d.ts +1 -3
  146. package/dist/homebridge-ui/server.d.ts.map +1 -1
  147. package/dist/homebridge-ui/server.js +8 -471
  148. package/dist/homebridge-ui/server.js.map +1 -1
  149. package/dist/homebridge-ui/settings.js +8 -0
  150. package/dist/homebridge-ui/settings.js.map +1 -0
  151. package/dist/homebridge-ui/switchbotClient.js +247 -0
  152. package/dist/homebridge-ui/switchbotClient.js.map +1 -0
  153. package/dist/homebridge-ui/utils/config-parser.d.ts +39 -0
  154. package/dist/homebridge-ui/utils/config-parser.d.ts.map +1 -0
  155. package/dist/homebridge-ui/utils/config-parser.js +108 -0
  156. package/dist/homebridge-ui/utils/config-parser.js.map +1 -0
  157. package/dist/homebridge-ui/utils/device-migration.d.ts +35 -0
  158. package/dist/homebridge-ui/utils/device-migration.d.ts.map +1 -0
  159. package/dist/homebridge-ui/utils/device-migration.js +111 -0
  160. package/dist/homebridge-ui/utils/device-migration.js.map +1 -0
  161. package/dist/homebridge-ui/utils/logger.d.ts +7 -0
  162. package/dist/homebridge-ui/utils/logger.d.ts.map +1 -0
  163. package/dist/homebridge-ui/utils/logger.js +17 -0
  164. package/dist/homebridge-ui/utils/logger.js.map +1 -0
  165. package/dist/index.d.ts +10 -0
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +12 -2
  168. package/dist/index.js.map +1 -1
  169. package/dist/settings.d.ts +1 -0
  170. package/dist/settings.d.ts.map +1 -1
  171. package/dist/settings.js +1 -0
  172. package/dist/settings.js.map +1 -1
  173. package/dist/switchbotClient.d.ts +12 -10
  174. package/dist/switchbotClient.d.ts.map +1 -1
  175. package/dist/switchbotClient.js +156 -103
  176. package/dist/switchbotClient.js.map +1 -1
  177. package/dist/utils.d.ts +76 -1
  178. package/dist/utils.d.ts.map +1 -1
  179. package/dist/utils.js +1121 -4
  180. package/dist/utils.js.map +1 -1
  181. package/docs/assets/highlight.css +16 -2
  182. package/docs/assets/main.js +1 -1
  183. package/docs/index.html +82 -5
  184. package/docs/variables/default.html +3 -1
  185. package/eslint.config.js +9 -5
  186. package/nodemon.json +2 -2
  187. package/package.json +34 -21
  188. package/scripts/build-ui.js +37 -0
  189. package/scripts/free-dev-ports.mjs +105 -0
  190. package/scripts/generate-matter-maps.js +34 -17
  191. package/scripts/sync-device-types.mjs +31 -0
  192. package/src/SwitchBotHAPPlatform.ts +558 -0
  193. package/src/SwitchBotMatterPlatform.ts +538 -0
  194. package/src/device-types.js +246 -0
  195. package/src/device-types.js.map +1 -0
  196. package/src/device-types.ts +261 -0
  197. package/src/deviceCommandMapper.js +319 -0
  198. package/src/deviceCommandMapper.js.map +1 -0
  199. package/src/deviceCommandMapper.ts +333 -0
  200. package/src/deviceFactory.ts +125 -45
  201. package/src/devices/genericDevice.ts +411 -69
  202. package/src/errors.js +32 -0
  203. package/src/errors.js.map +1 -0
  204. package/src/errors.ts +35 -0
  205. package/src/homebridge-ui/endpoints/config.ts +110 -0
  206. package/src/homebridge-ui/endpoints/devices.ts +153 -0
  207. package/src/homebridge-ui/endpoints/discovery.ts +240 -0
  208. package/src/homebridge-ui/public/css/styles.css +483 -0
  209. package/src/homebridge-ui/public/index.html +197 -621
  210. package/src/homebridge-ui/public/js/advanced-settings.ts +94 -0
  211. package/src/homebridge-ui/public/js/api.ts +355 -0
  212. package/src/homebridge-ui/public/js/app.ts +22 -0
  213. package/src/homebridge-ui/public/js/constants.ts +1 -0
  214. package/src/homebridge-ui/public/js/credentials.ts +105 -0
  215. package/src/homebridge-ui/public/js/devices-delete.ts +227 -0
  216. package/src/homebridge-ui/public/js/devices.ts +106 -0
  217. package/src/homebridge-ui/public/js/discovery.ts +1335 -0
  218. package/src/homebridge-ui/public/js/logger.ts +17 -0
  219. package/src/homebridge-ui/public/js/modal.ts +35 -0
  220. package/src/homebridge-ui/public/js/modals.ts +765 -0
  221. package/src/homebridge-ui/public/js/render.ts +1084 -0
  222. package/src/homebridge-ui/public/js/toast.ts +44 -0
  223. package/src/homebridge-ui/public/js/types.ts +26 -0
  224. package/src/homebridge-ui/server.ts +9 -554
  225. package/src/homebridge-ui/utils/config-parser.ts +125 -0
  226. package/src/homebridge-ui/utils/device-migration.ts +144 -0
  227. package/src/homebridge-ui/utils/logger.ts +17 -0
  228. package/src/index.ts +12 -2
  229. package/src/settings.js +8 -0
  230. package/src/settings.js.map +1 -0
  231. package/src/settings.ts +2 -0
  232. package/src/switchbotClient.js +247 -0
  233. package/src/switchbotClient.js.map +1 -0
  234. package/src/switchbotClient.ts +177 -114
  235. package/src/utils.ts +1133 -5
  236. package/test/client/switchbot-client-debounce.spec.ts +35 -0
  237. package/test/client/switchbot-client-openapi.spec.ts +19 -0
  238. package/test/client/switchbotClient.spec.ts +64 -0
  239. package/test/device/device-mapping.spec.ts +23 -0
  240. package/test/device/deviceBase.spec.ts +26 -0
  241. package/test/device/deviceFactory-edge.spec.ts +15 -0
  242. package/test/device/deviceFactory.spec.ts +33 -0
  243. package/test/device/fan-swing.spec.ts +34 -0
  244. package/test/device/genericDevice-blepoll.spec.ts +47 -0
  245. package/test/device/irdevice.spec.ts +9 -0
  246. package/test/device/lock-users.spec.ts +35 -0
  247. package/test/device/matter-descriptors.spec.ts +22 -0
  248. package/test/device/matter-device-state.spec.ts +37 -0
  249. package/test/e2e/run-e2e.spec.ts +18 -19
  250. package/test/errors/errors.spec.ts +10 -0
  251. package/test/helpers/matter-harness.ts +20 -9
  252. package/test/homebridge-ui/server.spec.ts +9 -0
  253. package/test/platform/accessory-restore.spec.ts +37 -0
  254. package/test/platform/matter-childbridge.spec.ts +34 -0
  255. package/test/platform/matter-integration.spec.ts +33 -0
  256. package/test/platform/platform-edge.spec.ts +73 -0
  257. package/test/platform/platform.integration.spec.ts +34 -0
  258. package/test/utils/utils-extra.spec.ts +10 -0
  259. package/test/utils/utils.spec.ts +53 -0
  260. package/todo/TODO.md +80 -0
  261. package/tsconfig.ui.json +11 -0
  262. package/.github/npm-version-script-esm.js +0 -97
  263. package/.github/workflows/beta-release.yml +0 -52
  264. package/dist/platform.d.ts +0 -35
  265. package/dist/platform.d.ts.map +0 -1
  266. package/dist/platform.js +0 -945
  267. package/dist/platform.js.map +0 -1
  268. package/src/platform.ts +0 -963
  269. package/test/accessory-restore.spec.ts +0 -73
  270. package/test/device-mapping.spec.ts +0 -37
  271. package/test/deviceFactory.spec.ts +0 -18
  272. package/test/fan-swing.spec.ts +0 -29
  273. package/test/lock-users.spec.ts +0 -44
  274. package/test/matter-childbridge.spec.ts +0 -55
  275. package/test/matter-descriptors.spec.ts +0 -97
  276. package/test/matter-device-state.spec.ts +0 -101
  277. package/test/matter-integration.spec.ts +0 -70
  278. package/test/platform.integration.spec.ts +0 -55
  279. package/test/switchbot-client-debounce.spec.ts +0 -131
  280. package/test/switchbot-client-openapi.spec.ts +0 -56
  281. package/test/switchbotClient.spec.ts +0 -10
  282. package/test/utils.spec.ts +0 -20
@@ -0,0 +1,22 @@
1
+ import { loadCredentialStatus, saveCredentials } from './credentials.js'
2
+ import { initRemoveAllButton, loadConfiguredDevices } from './devices.js'
3
+ import { discoverDevices, initializeDiscoverySettings } from './discovery.js';
4
+
5
+ (window as any).loadCredentialStatus = loadCredentialStatus;
6
+ (window as any).saveCredentials = saveCredentials;
7
+ (window as any).discoverDevices = discoverDevices
8
+
9
+ // Initialize on page load
10
+ async function init(): Promise<void> {
11
+ await loadCredentialStatus()
12
+ await initializeDiscoverySettings()
13
+ await loadConfiguredDevices()
14
+ await initRemoveAllButton()
15
+ }
16
+
17
+ // Run initialization when DOM is ready
18
+ if (document.readyState === 'loading') {
19
+ document.addEventListener('DOMContentLoaded', init)
20
+ } else {
21
+ init()
22
+ }
@@ -0,0 +1,2 @@
1
+ export { DEVICE_TYPES } from '../../../device-types.js';
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { DEVICE_TYPES } from '../../../device-types.js';
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1 @@
1
+ export { DEVICE_TYPES } from '../../../device-types.js'
@@ -0,0 +1,3 @@
1
+ export declare function loadCredentialStatus(): Promise<void>;
2
+ export declare function saveCredentials(): Promise<void>;
3
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/credentials.ts"],"names":[],"mappings":"AAIA,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC1D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAiErD"}
@@ -0,0 +1,99 @@
1
+ import { uiLog } from './logger.js';
2
+ import { hideBusyUi, showBusyUi } from './modal.js';
3
+ import { toastError, toastSuccess, toastWarning } from './toast.js';
4
+ export async function loadCredentialStatus() {
5
+ try {
6
+ if (typeof homebridge.getPluginConfig !== 'function') {
7
+ uiLog.error('Homebridge UI API not available');
8
+ return;
9
+ }
10
+ const configArr = await homebridge.getPluginConfig();
11
+ const config = Array.isArray(configArr) && configArr.length > 0 ? configArr[0] : {};
12
+ const token = config.openApiToken || '';
13
+ const secret = config.openApiSecret || '';
14
+ const tokenStatus = document.getElementById('tokenStatus');
15
+ const secretStatus = document.getElementById('secretStatus');
16
+ if (!tokenStatus || !secretStatus) {
17
+ return;
18
+ }
19
+ if (token) {
20
+ tokenStatus.textContent = `✓ Configured (${token.length} characters)`;
21
+ tokenStatus.classList.add('ok');
22
+ }
23
+ else {
24
+ tokenStatus.textContent = 'Not configured';
25
+ tokenStatus.classList.remove('ok');
26
+ }
27
+ if (secret) {
28
+ secretStatus.textContent = `✓ Configured (${secret.length} characters)`;
29
+ secretStatus.classList.add('ok');
30
+ }
31
+ else {
32
+ secretStatus.textContent = 'Not configured';
33
+ secretStatus.classList.remove('ok');
34
+ }
35
+ }
36
+ catch (e) {
37
+ uiLog.error('Error loading credentials:', e);
38
+ }
39
+ }
40
+ export async function saveCredentials() {
41
+ const token = document.getElementById('token')?.value;
42
+ const secret = document.getElementById('secret')?.value;
43
+ const saveStatus = document.getElementById('saveStatus');
44
+ const saveBtn = document.getElementById('saveBtn');
45
+ if (!saveStatus || !saveBtn) {
46
+ return;
47
+ }
48
+ if (!token || !secret) {
49
+ saveStatus.textContent = 'Please enter both token and secret';
50
+ saveStatus.classList.add('error');
51
+ toastWarning('Please enter both token and secret');
52
+ return;
53
+ }
54
+ try {
55
+ showBusyUi();
56
+ saveBtn.disabled = true;
57
+ saveBtn.textContent = 'Saving...';
58
+ uiLog.info('Saving credentials...');
59
+ if (typeof homebridge.getPluginConfig !== 'function' || typeof homebridge.updatePluginConfig !== 'function') {
60
+ throw new TypeError('Homebridge UI API not available');
61
+ }
62
+ const configArr = await homebridge.getPluginConfig();
63
+ if (!Array.isArray(configArr) || configArr.length === 0) {
64
+ throw new Error('No plugin config found');
65
+ }
66
+ const config = configArr[0];
67
+ config.openApiToken = token;
68
+ config.openApiSecret = secret;
69
+ await homebridge.updatePluginConfig([config]);
70
+ if (typeof homebridge.savePluginConfig === 'function') {
71
+ await homebridge.savePluginConfig();
72
+ }
73
+ saveStatus.textContent = `✓ Credentials saved successfully`;
74
+ saveStatus.classList.remove('error');
75
+ saveStatus.classList.add('success-msg');
76
+ toastSuccess('Credentials saved successfully');
77
+ document.getElementById('token').value = '';
78
+ document.getElementById('secret').value = '';
79
+ // Reload status to verify save
80
+ setTimeout(loadCredentialStatus, 500);
81
+ // Clear status message
82
+ setTimeout(() => {
83
+ saveStatus.textContent = '';
84
+ saveStatus.classList.remove('success-msg');
85
+ }, 3000);
86
+ }
87
+ catch (e) {
88
+ uiLog.error('Save error:', e);
89
+ saveStatus.textContent = `Error: ${e instanceof Error ? e.message : 'Failed to save'}`;
90
+ saveStatus.classList.add('error');
91
+ toastError(e instanceof Error ? e.message : 'Failed to save credentials');
92
+ }
93
+ finally {
94
+ hideBusyUi();
95
+ saveBtn.disabled = false;
96
+ saveBtn.textContent = 'Save Credentials';
97
+ }
98
+ }
99
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import { uiLog } from './logger.js'
2
+ import { hideBusyUi, showBusyUi } from './modal.js'
3
+ import { toastError, toastSuccess, toastWarning } from './toast.js'
4
+
5
+ export async function loadCredentialStatus(): Promise<void> {
6
+ try {
7
+ if (typeof homebridge.getPluginConfig !== 'function') {
8
+ uiLog.error('Homebridge UI API not available')
9
+ return
10
+ }
11
+ const configArr = await homebridge.getPluginConfig()
12
+ const config = Array.isArray(configArr) && configArr.length > 0 ? configArr[0] : {}
13
+ const token = config.openApiToken || ''
14
+ const secret = config.openApiSecret || ''
15
+
16
+ const tokenStatus = document.getElementById('tokenStatus')
17
+ const secretStatus = document.getElementById('secretStatus')
18
+ if (!tokenStatus || !secretStatus) {
19
+ return
20
+ }
21
+ if (token) {
22
+ tokenStatus.textContent = `✓ Configured (${token.length} characters)`
23
+ tokenStatus.classList.add('ok')
24
+ } else {
25
+ tokenStatus.textContent = 'Not configured'
26
+ tokenStatus.classList.remove('ok')
27
+ }
28
+ if (secret) {
29
+ secretStatus.textContent = `✓ Configured (${secret.length} characters)`
30
+ secretStatus.classList.add('ok')
31
+ } else {
32
+ secretStatus.textContent = 'Not configured'
33
+ secretStatus.classList.remove('ok')
34
+ }
35
+ } catch (e) {
36
+ uiLog.error('Error loading credentials:', e)
37
+ }
38
+ }
39
+
40
+ export async function saveCredentials(): Promise<void> {
41
+ const token = (document.getElementById('token') as HTMLInputElement)?.value
42
+ const secret = (document.getElementById('secret') as HTMLInputElement)?.value
43
+ const saveStatus = document.getElementById('saveStatus')
44
+ const saveBtn = document.getElementById('saveBtn') as HTMLButtonElement
45
+
46
+ if (!saveStatus || !saveBtn) {
47
+ return
48
+ }
49
+
50
+ if (!token || !secret) {
51
+ saveStatus.textContent = 'Please enter both token and secret'
52
+ saveStatus.classList.add('error')
53
+ toastWarning('Please enter both token and secret')
54
+ return
55
+ }
56
+
57
+ try {
58
+ showBusyUi()
59
+ saveBtn.disabled = true
60
+ saveBtn.textContent = 'Saving...'
61
+ uiLog.info('Saving credentials...')
62
+
63
+ if (typeof homebridge.getPluginConfig !== 'function' || typeof homebridge.updatePluginConfig !== 'function') {
64
+ throw new TypeError('Homebridge UI API not available')
65
+ }
66
+ const configArr = await homebridge.getPluginConfig()
67
+ if (!Array.isArray(configArr) || configArr.length === 0) {
68
+ throw new Error('No plugin config found')
69
+ }
70
+ const config = configArr[0]
71
+ config.openApiToken = token
72
+ config.openApiSecret = secret
73
+ await homebridge.updatePluginConfig([config])
74
+ if (typeof homebridge.savePluginConfig === 'function') {
75
+ await homebridge.savePluginConfig()
76
+ }
77
+
78
+ saveStatus.textContent = `✓ Credentials saved successfully`
79
+ saveStatus.classList.remove('error')
80
+ saveStatus.classList.add('success-msg')
81
+ toastSuccess('Credentials saved successfully')
82
+
83
+ // Clear inputs after successful save
84
+ ;(document.getElementById('token') as HTMLInputElement).value = ''
85
+ ;(document.getElementById('secret') as HTMLInputElement).value = ''
86
+
87
+ // Reload status to verify save
88
+ setTimeout(loadCredentialStatus, 500)
89
+
90
+ // Clear status message
91
+ setTimeout(() => {
92
+ saveStatus.textContent = ''
93
+ saveStatus.classList.remove('success-msg')
94
+ }, 3000)
95
+ } catch (e) {
96
+ uiLog.error('Save error:', e)
97
+ saveStatus.textContent = `Error: ${e instanceof Error ? e.message : 'Failed to save'}`
98
+ saveStatus.classList.add('error')
99
+ toastError(e instanceof Error ? e.message : 'Failed to save credentials')
100
+ } finally {
101
+ hideBusyUi()
102
+ saveBtn.disabled = false
103
+ saveBtn.textContent = 'Save Credentials'
104
+ }
105
+ }
@@ -0,0 +1,3 @@
1
+ export declare function deleteDeviceFromConfig(deviceId: string, deviceName: string): Promise<void>;
2
+ export declare function deleteAllDevicesFromConfig(): Promise<void>;
3
+ //# sourceMappingURL=devices-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices-delete.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/devices-delete.ts"],"names":[],"mappings":"AAyEA,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChG;AA6ED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC,CA0ChE"}
@@ -0,0 +1,199 @@
1
+ import { deleteAllDevices as apiDeleteAllDevices, deleteDevice as apiDeleteDevice, fetchDevices, syncParentPluginConfigFromDisk } from './api.js';
2
+ import { uiLog } from './logger.js';
3
+ import { hideBusyUi, showBusyUi } from './modal.js';
4
+ import { renderDeviceList } from './render.js';
5
+ import { toastError, toastSuccess, toastWarning } from './toast.js';
6
+ async function confirmDeleteDialog(deviceNameOrId) {
7
+ return new Promise((resolve) => {
8
+ const overlay = document.createElement('div');
9
+ overlay.style.position = 'fixed';
10
+ overlay.style.top = '0';
11
+ overlay.style.left = '0';
12
+ overlay.style.width = '100%';
13
+ overlay.style.height = '100%';
14
+ overlay.style.background = 'rgba(0,0,0,0.6)';
15
+ overlay.style.display = 'flex';
16
+ overlay.style.alignItems = 'center';
17
+ overlay.style.justifyContent = 'center';
18
+ overlay.style.zIndex = '10000';
19
+ const modal = document.createElement('div');
20
+ modal.style.background = getComputedStyle(document.body).backgroundColor;
21
+ modal.style.color = getComputedStyle(document.body).color;
22
+ modal.style.padding = '20px';
23
+ modal.style.borderRadius = '10px';
24
+ modal.style.minWidth = '340px';
25
+ modal.style.maxWidth = '90vw';
26
+ modal.style.boxShadow = '0 12px 40px rgba(0,0,0,0.35)';
27
+ const title = document.createElement('h3');
28
+ title.textContent = 'Delete Device';
29
+ title.style.margin = '0 0 10px 0';
30
+ const message = document.createElement('p');
31
+ message.textContent = `Remove "${deviceNameOrId}" from configuration?`;
32
+ message.style.margin = '0 0 16px 0';
33
+ const actions = document.createElement('div');
34
+ actions.style.display = 'flex';
35
+ actions.style.justifyContent = 'flex-end';
36
+ actions.style.gap = '8px';
37
+ const cancelBtn = document.createElement('button');
38
+ cancelBtn.textContent = 'Cancel';
39
+ cancelBtn.style.background = '#6b7280';
40
+ const deleteBtn = document.createElement('button');
41
+ deleteBtn.textContent = 'Delete';
42
+ deleteBtn.style.background = '#ef4444';
43
+ const cleanup = (result) => {
44
+ overlay.remove();
45
+ resolve(result);
46
+ };
47
+ cancelBtn.onclick = () => cleanup(false);
48
+ deleteBtn.onclick = () => cleanup(true);
49
+ overlay.addEventListener('click', (event) => {
50
+ if (event.target === overlay) {
51
+ cleanup(false);
52
+ }
53
+ });
54
+ actions.appendChild(cancelBtn);
55
+ actions.appendChild(deleteBtn);
56
+ modal.appendChild(title);
57
+ modal.appendChild(message);
58
+ modal.appendChild(actions);
59
+ overlay.appendChild(modal);
60
+ document.body.appendChild(overlay);
61
+ });
62
+ }
63
+ export async function deleteDeviceFromConfig(deviceId, deviceName) {
64
+ uiLog.info('Delete button clicked for device:', deviceId, deviceName);
65
+ const confirmed = await confirmDeleteDialog(deviceName || deviceId);
66
+ if (!confirmed) {
67
+ uiLog.info('Delete cancelled by user');
68
+ return;
69
+ }
70
+ try {
71
+ showBusyUi();
72
+ uiLog.info('Deleting device from config:', deviceId);
73
+ const resp = await apiDeleteDevice(deviceId);
74
+ uiLog.info('Delete response:', resp);
75
+ uiLog.info('Syncing parent config from disk...');
76
+ const synced = await syncParentPluginConfigFromDisk(true);
77
+ if (!synced) {
78
+ toastWarning('Device deleted, but configuration sync failed');
79
+ }
80
+ uiLog.info('Refreshing device list...');
81
+ const list = await fetchDevices();
82
+ uiLog.info('Rendering devices:', list.length);
83
+ renderDeviceList(list);
84
+ uiLog.info('✓ Device deleted successfully');
85
+ toastSuccess(`Device "${deviceName || deviceId}" deleted successfully`);
86
+ }
87
+ catch (e) {
88
+ uiLog.error('Delete error:', e);
89
+ toastError(e instanceof Error ? e.message : 'Failed to delete device');
90
+ }
91
+ finally {
92
+ hideBusyUi();
93
+ }
94
+ }
95
+ async function confirmDeleteAllDialog(deviceCount) {
96
+ return new Promise((resolve) => {
97
+ const overlay = document.createElement('div');
98
+ overlay.style.position = 'fixed';
99
+ overlay.style.top = '0';
100
+ overlay.style.left = '0';
101
+ overlay.style.width = '100%';
102
+ overlay.style.height = '100%';
103
+ overlay.style.background = 'rgba(0,0,0,0.7)';
104
+ overlay.style.display = 'flex';
105
+ overlay.style.alignItems = 'center';
106
+ overlay.style.justifyContent = 'center';
107
+ overlay.style.zIndex = '10000';
108
+ const modal = document.createElement('div');
109
+ modal.style.background = getComputedStyle(document.body).backgroundColor;
110
+ modal.style.color = getComputedStyle(document.body).color;
111
+ modal.style.padding = '20px';
112
+ modal.style.borderRadius = '10px';
113
+ modal.style.minWidth = '380px';
114
+ modal.style.maxWidth = '90vw';
115
+ modal.style.boxShadow = '0 12px 40px rgba(0,0,0,0.35)';
116
+ modal.style.borderTop = '3px solid #ef4444';
117
+ const title = document.createElement('h3');
118
+ title.textContent = '⚠️ Remove All Devices';
119
+ title.style.margin = '0 0 12px 0';
120
+ title.style.color = '#ef4444';
121
+ const message = document.createElement('p');
122
+ message.innerHTML = `Are you sure you want to remove <strong>all ${deviceCount} device(s)</strong> from your configuration?<br><br>This action cannot be undone.`;
123
+ message.style.margin = '0 0 18px 0';
124
+ message.style.lineHeight = '1.5';
125
+ const actions = document.createElement('div');
126
+ actions.style.display = 'flex';
127
+ actions.style.justifyContent = 'flex-end';
128
+ actions.style.gap = '10px';
129
+ const cancelBtn = document.createElement('button');
130
+ cancelBtn.textContent = 'Cancel';
131
+ cancelBtn.style.background = '#6b7280';
132
+ cancelBtn.style.padding = '8px 16px';
133
+ cancelBtn.style.fontSize = '13px';
134
+ cancelBtn.className = 'secondary';
135
+ const deleteBtn = document.createElement('button');
136
+ deleteBtn.textContent = 'Remove All';
137
+ deleteBtn.style.background = '#ef4444';
138
+ deleteBtn.style.padding = '8px 20px';
139
+ deleteBtn.style.fontSize = '13px';
140
+ const cleanup = (result) => {
141
+ overlay.remove();
142
+ resolve(result);
143
+ };
144
+ cancelBtn.onclick = () => cleanup(false);
145
+ deleteBtn.onclick = () => cleanup(true);
146
+ overlay.addEventListener('click', (event) => {
147
+ if (event.target === overlay) {
148
+ cleanup(false);
149
+ }
150
+ });
151
+ actions.appendChild(cancelBtn);
152
+ actions.appendChild(deleteBtn);
153
+ modal.appendChild(title);
154
+ modal.appendChild(message);
155
+ modal.appendChild(actions);
156
+ overlay.appendChild(modal);
157
+ document.body.appendChild(overlay);
158
+ });
159
+ }
160
+ export async function deleteAllDevicesFromConfig() {
161
+ uiLog.info('Remove All Devices button clicked');
162
+ try {
163
+ // Get current device count
164
+ const list = await fetchDevices();
165
+ if (!list || list.length === 0) {
166
+ toastWarning('No devices to remove');
167
+ return;
168
+ }
169
+ const confirmed = await confirmDeleteAllDialog(list.length);
170
+ if (!confirmed) {
171
+ uiLog.info('Remove all cancelled by user');
172
+ return;
173
+ }
174
+ showBusyUi();
175
+ uiLog.info('Deleting all devices from config');
176
+ const resp = await apiDeleteAllDevices();
177
+ uiLog.info('Delete all response:', resp);
178
+ uiLog.info('Syncing parent config from disk...');
179
+ const synced = await syncParentPluginConfigFromDisk(true);
180
+ if (!synced) {
181
+ toastWarning('Devices deleted, but configuration sync failed');
182
+ }
183
+ uiLog.info('Refreshing device list...');
184
+ const updatedList = await fetchDevices();
185
+ uiLog.info('Rendering devices:', updatedList.length);
186
+ renderDeviceList(updatedList);
187
+ const deletedCount = resp?.deletedCount || 0;
188
+ uiLog.info(`✓ Removed ${deletedCount} device(s) successfully`);
189
+ toastSuccess(`Removed ${deletedCount} device(s) successfully`);
190
+ }
191
+ catch (e) {
192
+ uiLog.error('Delete all error:', e);
193
+ toastError(e instanceof Error ? e.message : 'Failed to delete all devices');
194
+ }
195
+ finally {
196
+ hideBusyUi();
197
+ }
198
+ }
199
+ //# sourceMappingURL=devices-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices-delete.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/devices-delete.ts"],"names":[],"mappings":"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"}