amaran-light-cli 1.11.0 → 1.12.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 (363) hide show
  1. package/README.md +108 -14
  2. package/dist/__tests__/autoCct.test.js +27 -0
  3. package/dist/__tests__/autoCct.test.js.map +1 -1
  4. package/dist/__tests__/bleHttpControl.test.d.ts +2 -0
  5. package/dist/__tests__/bleHttpControl.test.d.ts.map +1 -0
  6. package/dist/__tests__/bleHttpControl.test.js +230 -0
  7. package/dist/__tests__/bleHttpControl.test.js.map +1 -0
  8. package/dist/__tests__/bleStack.test.d.ts +2 -0
  9. package/dist/__tests__/bleStack.test.d.ts.map +1 -0
  10. package/dist/__tests__/bleStack.test.js +1239 -0
  11. package/dist/__tests__/bleStack.test.js.map +1 -0
  12. package/dist/__tests__/cctUtil.test.js +9 -4
  13. package/dist/__tests__/cctUtil.test.js.map +1 -1
  14. package/dist/__tests__/circadianDashboardSettings.test.d.ts +2 -0
  15. package/dist/__tests__/circadianDashboardSettings.test.d.ts.map +1 -0
  16. package/dist/__tests__/circadianDashboardSettings.test.js +82 -0
  17. package/dist/__tests__/circadianDashboardSettings.test.js.map +1 -0
  18. package/dist/__tests__/circadianIsolation.test.d.ts +2 -0
  19. package/dist/__tests__/circadianIsolation.test.d.ts.map +1 -0
  20. package/dist/__tests__/circadianIsolation.test.js +30 -0
  21. package/dist/__tests__/circadianIsolation.test.js.map +1 -0
  22. package/dist/__tests__/cli.config.test.js +49 -0
  23. package/dist/__tests__/cli.config.test.js.map +1 -1
  24. package/dist/__tests__/cli.smoke.test.js +34 -0
  25. package/dist/__tests__/cli.smoke.test.js.map +1 -1
  26. package/dist/__tests__/currentCct.test.d.ts +2 -0
  27. package/dist/__tests__/currentCct.test.d.ts.map +1 -0
  28. package/dist/__tests__/currentCct.test.js +29 -0
  29. package/dist/__tests__/currentCct.test.js.map +1 -0
  30. package/dist/__tests__/dashboard.test.d.ts +2 -0
  31. package/dist/__tests__/dashboard.test.d.ts.map +1 -0
  32. package/dist/__tests__/dashboard.test.js +126 -0
  33. package/dist/__tests__/dashboard.test.js.map +1 -0
  34. package/dist/__tests__/daylightSimulationParseUtils.test.d.ts +2 -0
  35. package/dist/__tests__/daylightSimulationParseUtils.test.d.ts.map +1 -0
  36. package/dist/__tests__/daylightSimulationParseUtils.test.js +16 -0
  37. package/dist/__tests__/daylightSimulationParseUtils.test.js.map +1 -0
  38. package/dist/__tests__/desktopImport.test.d.ts +2 -0
  39. package/dist/__tests__/desktopImport.test.d.ts.map +1 -0
  40. package/dist/__tests__/desktopImport.test.js +234 -0
  41. package/dist/__tests__/desktopImport.test.js.map +1 -0
  42. package/dist/__tests__/lightControl.basic.test.d.ts +2 -0
  43. package/dist/__tests__/lightControl.basic.test.d.ts.map +1 -0
  44. package/dist/__tests__/lightControl.basic.test.js +119 -0
  45. package/dist/__tests__/lightControl.basic.test.js.map +1 -0
  46. package/dist/__tests__/lightControl.colorEffects.test.d.ts +2 -0
  47. package/dist/__tests__/lightControl.colorEffects.test.d.ts.map +1 -0
  48. package/dist/__tests__/lightControl.colorEffects.test.js +170 -0
  49. package/dist/__tests__/lightControl.colorEffects.test.js.map +1 -0
  50. package/dist/__tests__/lightControl.management.test.d.ts +2 -0
  51. package/dist/__tests__/lightControl.management.test.d.ts.map +1 -0
  52. package/dist/__tests__/lightControl.management.test.js +90 -0
  53. package/dist/__tests__/lightControl.management.test.js.map +1 -0
  54. package/dist/__tests__/lightControlTestUtils.d.ts +10 -0
  55. package/dist/__tests__/lightControlTestUtils.d.ts.map +1 -0
  56. package/dist/__tests__/lightControlTestUtils.js +57 -0
  57. package/dist/__tests__/lightControlTestUtils.js.map +1 -0
  58. package/dist/__tests__/meshConfiguration.test.d.ts +2 -0
  59. package/dist/__tests__/meshConfiguration.test.d.ts.map +1 -0
  60. package/dist/__tests__/meshConfiguration.test.js +78 -0
  61. package/dist/__tests__/meshConfiguration.test.js.map +1 -0
  62. package/dist/__tests__/nativeGroups.test.d.ts +2 -0
  63. package/dist/__tests__/nativeGroups.test.d.ts.map +1 -0
  64. package/dist/__tests__/nativeGroups.test.js +104 -0
  65. package/dist/__tests__/nativeGroups.test.js.map +1 -0
  66. package/dist/__tests__/programApi.test.d.ts +2 -0
  67. package/dist/__tests__/programApi.test.d.ts.map +1 -0
  68. package/dist/__tests__/programApi.test.js +73 -0
  69. package/dist/__tests__/programApi.test.js.map +1 -0
  70. package/dist/__tests__/programs.test.d.ts +2 -0
  71. package/dist/__tests__/programs.test.d.ts.map +1 -0
  72. package/dist/__tests__/programs.test.js +176 -0
  73. package/dist/__tests__/programs.test.js.map +1 -0
  74. package/dist/__tests__/scheduleMaker.test.d.ts +2 -0
  75. package/dist/__tests__/scheduleMaker.test.d.ts.map +1 -0
  76. package/dist/__tests__/scheduleMaker.test.js +25 -0
  77. package/dist/__tests__/scheduleMaker.test.js.map +1 -0
  78. package/dist/ble/async.d.ts +2 -0
  79. package/dist/ble/async.d.ts.map +1 -0
  80. package/dist/ble/async.js +15 -0
  81. package/dist/ble/async.js.map +1 -0
  82. package/dist/ble/colors.d.ts +5 -0
  83. package/dist/ble/colors.d.ts.map +1 -0
  84. package/dist/ble/colors.js +44 -0
  85. package/dist/ble/colors.js.map +1 -0
  86. package/dist/ble/configuration.d.ts +22 -0
  87. package/dist/ble/configuration.d.ts.map +1 -0
  88. package/dist/ble/configuration.js +122 -0
  89. package/dist/ble/configuration.js.map +1 -0
  90. package/dist/ble/controller.d.ts +118 -0
  91. package/dist/ble/controller.d.ts.map +1 -0
  92. package/dist/ble/controller.js +931 -0
  93. package/dist/ble/controller.js.map +1 -0
  94. package/dist/ble/crypto.d.ts +34 -0
  95. package/dist/ble/crypto.d.ts.map +1 -0
  96. package/dist/ble/crypto.js +178 -0
  97. package/dist/ble/crypto.js.map +1 -0
  98. package/dist/ble/daemon.d.ts +2 -0
  99. package/dist/ble/daemon.d.ts.map +1 -0
  100. package/dist/ble/daemon.js +76 -0
  101. package/dist/ble/daemon.js.map +1 -0
  102. package/dist/ble/dashboard.d.ts +331 -0
  103. package/dist/ble/dashboard.d.ts.map +1 -0
  104. package/dist/ble/dashboard.js +280 -0
  105. package/dist/ble/dashboard.js.map +1 -0
  106. package/dist/ble/desktop.d.ts +4 -0
  107. package/dist/ble/desktop.d.ts.map +1 -0
  108. package/dist/ble/desktop.js +33 -0
  109. package/dist/ble/desktop.js.map +1 -0
  110. package/dist/ble/desktopLibrary.d.ts +12 -0
  111. package/dist/ble/desktopLibrary.d.ts.map +1 -0
  112. package/dist/ble/desktopLibrary.js +346 -0
  113. package/dist/ble/desktopLibrary.js.map +1 -0
  114. package/dist/ble/effects.d.ts +34 -0
  115. package/dist/ble/effects.d.ts.map +1 -0
  116. package/dist/ble/effects.js +138 -0
  117. package/dist/ble/effects.js.map +1 -0
  118. package/dist/ble/fan.d.ts +244 -0
  119. package/dist/ble/fan.d.ts.map +1 -0
  120. package/dist/ble/fan.js +46 -0
  121. package/dist/ble/fan.js.map +1 -0
  122. package/dist/ble/library.d.ts +341 -0
  123. package/dist/ble/library.d.ts.map +1 -0
  124. package/dist/ble/library.js +201 -0
  125. package/dist/ble/library.js.map +1 -0
  126. package/dist/ble/media.d.ts +133 -0
  127. package/dist/ble/media.d.ts.map +1 -0
  128. package/dist/ble/media.js +186 -0
  129. package/dist/ble/media.js.map +1 -0
  130. package/dist/ble/nativeGroups.d.ts +22 -0
  131. package/dist/ble/nativeGroups.d.ts.map +1 -0
  132. package/dist/ble/nativeGroups.js +114 -0
  133. package/dist/ble/nativeGroups.js.map +1 -0
  134. package/dist/ble/packets.d.ts +3 -0
  135. package/dist/ble/packets.d.ts.map +1 -0
  136. package/dist/ble/packets.js +15 -0
  137. package/dist/ble/packets.js.map +1 -0
  138. package/dist/ble/programs.d.ts +318 -0
  139. package/dist/ble/programs.d.ts.map +1 -0
  140. package/dist/ble/programs.js +329 -0
  141. package/dist/ble/programs.js.map +1 -0
  142. package/dist/ble/provisioning.d.ts +13 -0
  143. package/dist/ble/provisioning.d.ts.map +1 -0
  144. package/dist/ble/provisioning.js +39 -0
  145. package/dist/ble/provisioning.js.map +1 -0
  146. package/dist/ble/server.d.ts +18 -0
  147. package/dist/ble/server.d.ts.map +1 -0
  148. package/dist/ble/server.js +548 -0
  149. package/dist/ble/server.js.map +1 -0
  150. package/dist/ble/service.d.ts +2 -0
  151. package/dist/ble/service.d.ts.map +1 -0
  152. package/dist/ble/service.js +77 -0
  153. package/dist/ble/service.js.map +1 -0
  154. package/dist/ble/settings.d.ts +18 -0
  155. package/dist/ble/settings.d.ts.map +1 -0
  156. package/dist/ble/settings.js +25 -0
  157. package/dist/ble/settings.js.map +1 -0
  158. package/dist/ble/setup.d.ts +2 -0
  159. package/dist/ble/setup.d.ts.map +1 -0
  160. package/dist/ble/setup.js +31 -0
  161. package/dist/ble/setup.js.map +1 -0
  162. package/dist/ble/storage.d.ts +94 -0
  163. package/dist/ble/storage.d.ts.map +1 -0
  164. package/dist/ble/storage.js +132 -0
  165. package/dist/ble/storage.js.map +1 -0
  166. package/dist/ble/telink.d.ts +63 -0
  167. package/dist/ble/telink.d.ts.map +1 -0
  168. package/dist/ble/telink.js +108 -0
  169. package/dist/ble/telink.js.map +1 -0
  170. package/dist/ble/transitions.d.ts +3 -0
  171. package/dist/ble/transitions.d.ts.map +1 -0
  172. package/dist/ble/transitions.js +28 -0
  173. package/dist/ble/transitions.js.map +1 -0
  174. package/dist/ble/transport.d.ts +48 -0
  175. package/dist/ble/transport.d.ts.map +1 -0
  176. package/dist/ble/transport.js +370 -0
  177. package/dist/ble/transport.js.map +1 -0
  178. package/dist/circadian.d.ts +3 -0
  179. package/dist/circadian.d.ts.map +1 -1
  180. package/dist/circadian.js +2 -0
  181. package/dist/circadian.js.map +1 -1
  182. package/dist/cli.d.ts +3 -2
  183. package/dist/cli.d.ts.map +1 -1
  184. package/dist/cli.js +125 -6
  185. package/dist/cli.js.map +1 -1
  186. package/dist/commands/__tests__/newCommands.test.js +3 -4
  187. package/dist/commands/__tests__/newCommands.test.js.map +1 -1
  188. package/dist/commands/cmdUtils.d.ts +5 -2
  189. package/dist/commands/cmdUtils.d.ts.map +1 -1
  190. package/dist/commands/cmdUtils.js +29 -10
  191. package/dist/commands/cmdUtils.js.map +1 -1
  192. package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -1
  193. package/dist/commands/daylightSimulation/autoCct.js +67 -197
  194. package/dist/commands/daylightSimulation/autoCct.js.map +1 -1
  195. package/dist/commands/daylightSimulation/graphSchedule.d.ts +1 -1
  196. package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -1
  197. package/dist/commands/daylightSimulation/printSchedule.d.ts +1 -1
  198. package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -1
  199. package/dist/commands/daylightSimulation/printSchedule.js +2 -2
  200. package/dist/commands/daylightSimulation/printSchedule.js.map +1 -1
  201. package/dist/commands/daylightSimulation/service.d.ts +1 -1
  202. package/dist/commands/daylightSimulation/service.d.ts.map +1 -1
  203. package/dist/commands/daylightSimulation/service.js +5 -3
  204. package/dist/commands/daylightSimulation/service.js.map +1 -1
  205. package/dist/commands/daylightSimulation/simulateSchedule.d.ts +1 -1
  206. package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -1
  207. package/dist/commands/daylightSimulation/simulateSchedule.js +5 -4
  208. package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -1
  209. package/dist/commands/deviceControl/ble.d.ts +4 -0
  210. package/dist/commands/deviceControl/ble.d.ts.map +1 -0
  211. package/dist/commands/deviceControl/ble.js +214 -0
  212. package/dist/commands/deviceControl/ble.js.map +1 -0
  213. package/dist/commands/deviceControl/cct.d.ts.map +1 -1
  214. package/dist/commands/deviceControl/cct.js +41 -11
  215. package/dist/commands/deviceControl/cct.js.map +1 -1
  216. package/dist/commands/deviceControl/color.d.ts.map +1 -1
  217. package/dist/commands/deviceControl/color.js +13 -3
  218. package/dist/commands/deviceControl/color.js.map +1 -1
  219. package/dist/commands/deviceControl/config.d.ts.map +1 -1
  220. package/dist/commands/deviceControl/config.js +26 -3
  221. package/dist/commands/deviceControl/config.js.map +1 -1
  222. package/dist/commands/deviceControl/{discover.d.ts → desktop.d.ts} +3 -2
  223. package/dist/commands/deviceControl/desktop.d.ts.map +1 -0
  224. package/dist/commands/deviceControl/desktop.js +66 -0
  225. package/dist/commands/deviceControl/desktop.js.map +1 -0
  226. package/dist/commands/deviceControl/effect.d.ts.map +1 -1
  227. package/dist/commands/deviceControl/effect.js +90 -159
  228. package/dist/commands/deviceControl/effect.js.map +1 -1
  229. package/dist/commands/deviceControl/fan.d.ts.map +1 -1
  230. package/dist/commands/deviceControl/fan.js +77 -95
  231. package/dist/commands/deviceControl/fan.js.map +1 -1
  232. package/dist/commands/deviceControl/group.d.ts.map +1 -1
  233. package/dist/commands/deviceControl/group.js +43 -6
  234. package/dist/commands/deviceControl/group.js.map +1 -1
  235. package/dist/commands/deviceControl/hsi.d.ts.map +1 -1
  236. package/dist/commands/deviceControl/hsi.js +3 -1
  237. package/dist/commands/deviceControl/hsi.js.map +1 -1
  238. package/dist/commands/deviceControl/info.d.ts.map +1 -1
  239. package/dist/commands/deviceControl/info.js +0 -50
  240. package/dist/commands/deviceControl/info.js.map +1 -1
  241. package/dist/commands/deviceControl/intensity.d.ts.map +1 -1
  242. package/dist/commands/deviceControl/intensity.js +32 -8
  243. package/dist/commands/deviceControl/intensity.js.map +1 -1
  244. package/dist/commands/deviceControl/list.d.ts.map +1 -1
  245. package/dist/commands/deviceControl/list.js +3 -2
  246. package/dist/commands/deviceControl/list.js.map +1 -1
  247. package/dist/commands/deviceControl/power.d.ts.map +1 -1
  248. package/dist/commands/deviceControl/power.js +9 -3
  249. package/dist/commands/deviceControl/power.js.map +1 -1
  250. package/dist/commands/deviceControl/preset.d.ts.map +1 -1
  251. package/dist/commands/deviceControl/preset.js +56 -19
  252. package/dist/commands/deviceControl/preset.js.map +1 -1
  253. package/dist/commands/deviceControl/program.d.ts +4 -0
  254. package/dist/commands/deviceControl/program.d.ts.map +1 -0
  255. package/dist/commands/deviceControl/program.js +199 -0
  256. package/dist/commands/deviceControl/program.js.map +1 -0
  257. package/dist/commands/deviceControl/quickshot.d.ts.map +1 -1
  258. package/dist/commands/deviceControl/quickshot.js +75 -13
  259. package/dist/commands/deviceControl/quickshot.js.map +1 -1
  260. package/dist/commands/deviceControl/scene.d.ts.map +1 -1
  261. package/dist/commands/deviceControl/scene.js +72 -9
  262. package/dist/commands/deviceControl/scene.js.map +1 -1
  263. package/dist/commands/deviceControl/status.d.ts.map +1 -1
  264. package/dist/commands/deviceControl/status.js +26 -3
  265. package/dist/commands/deviceControl/status.js.map +1 -1
  266. package/dist/commands/parseUtils.d.ts +1 -1
  267. package/dist/commands/parseUtils.d.ts.map +1 -1
  268. package/dist/commands/parseUtils.js +1 -11
  269. package/dist/commands/parseUtils.js.map +1 -1
  270. package/dist/commands-api.d.ts +1 -1
  271. package/dist/commands-api.d.ts.map +1 -1
  272. package/dist/commands-api.js +1 -1
  273. package/dist/commands-api.js.map +1 -1
  274. package/dist/commands.d.ts.map +1 -1
  275. package/dist/commands.js +4 -2
  276. package/dist/commands.js.map +1 -1
  277. package/dist/config.d.ts +82 -0
  278. package/dist/config.d.ts.map +1 -1
  279. package/dist/config.js +13 -2
  280. package/dist/config.js.map +1 -1
  281. package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
  282. package/dist/daylightSimulation/cctUtil.js +2 -2
  283. package/dist/daylightSimulation/cctUtil.js.map +1 -1
  284. package/dist/daylightSimulation/constants.d.ts +10 -0
  285. package/dist/daylightSimulation/constants.d.ts.map +1 -1
  286. package/dist/daylightSimulation/constants.js +4 -0
  287. package/dist/daylightSimulation/constants.js.map +1 -1
  288. package/dist/daylightSimulation/currentCct.d.ts +42 -0
  289. package/dist/daylightSimulation/currentCct.d.ts.map +1 -0
  290. package/dist/daylightSimulation/currentCct.js +217 -0
  291. package/dist/daylightSimulation/currentCct.js.map +1 -0
  292. package/dist/daylightSimulation/dashboardSettings.d.ts +47 -0
  293. package/dist/daylightSimulation/dashboardSettings.d.ts.map +1 -0
  294. package/dist/daylightSimulation/dashboardSettings.js +95 -0
  295. package/dist/daylightSimulation/dashboardSettings.js.map +1 -0
  296. package/dist/daylightSimulation/dashboardStatus.d.ts +72 -0
  297. package/dist/daylightSimulation/dashboardStatus.d.ts.map +1 -0
  298. package/dist/daylightSimulation/dashboardStatus.js +191 -0
  299. package/dist/daylightSimulation/dashboardStatus.js.map +1 -0
  300. package/dist/daylightSimulation/parseUtils.d.ts +3 -0
  301. package/dist/daylightSimulation/parseUtils.d.ts.map +1 -0
  302. package/dist/daylightSimulation/parseUtils.js +25 -0
  303. package/dist/daylightSimulation/parseUtils.js.map +1 -0
  304. package/dist/daylightSimulation/scheduleMaker.d.ts +2 -2
  305. package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
  306. package/dist/daylightSimulation/scheduleMaker.js +6 -6
  307. package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
  308. package/dist/daylightSimulation/types.d.ts +13 -2
  309. package/dist/daylightSimulation/types.d.ts.map +1 -1
  310. package/dist/daylightSimulation/types.js +0 -2
  311. package/dist/daylightSimulation/types.js.map +1 -1
  312. package/dist/device-control.d.ts +1 -0
  313. package/dist/device-control.d.ts.map +1 -1
  314. package/dist/device-control.js +1 -0
  315. package/dist/device-control.js.map +1 -1
  316. package/dist/deviceControl/bleHttpControl.d.ts +129 -0
  317. package/dist/deviceControl/bleHttpControl.d.ts.map +1 -0
  318. package/dist/deviceControl/bleHttpControl.js +753 -0
  319. package/dist/deviceControl/bleHttpControl.js.map +1 -0
  320. package/dist/deviceControl/lightControl.d.ts +8 -68
  321. package/dist/deviceControl/lightControl.d.ts.map +1 -1
  322. package/dist/deviceControl/lightControl.js +6 -246
  323. package/dist/deviceControl/lightControl.js.map +1 -1
  324. package/dist/deviceControl/lightControlCommands.d.ts +68 -0
  325. package/dist/deviceControl/lightControlCommands.d.ts.map +1 -0
  326. package/dist/deviceControl/lightControlCommands.js +244 -0
  327. package/dist/deviceControl/lightControlCommands.js.map +1 -0
  328. package/dist/deviceControl/types.d.ts +75 -4
  329. package/dist/deviceControl/types.d.ts.map +1 -1
  330. package/dist/deviceControl/types.js +1 -0
  331. package/dist/deviceControl/types.js.map +1 -1
  332. package/dist/index.d.ts +2 -1
  333. package/dist/index.d.ts.map +1 -1
  334. package/dist/index.js +1 -0
  335. package/dist/index.js.map +1 -1
  336. package/dist/test/MockLightServer.d.ts +1 -0
  337. package/dist/test/MockLightServer.d.ts.map +1 -1
  338. package/dist/test/MockLightServer.js +5 -0
  339. package/dist/test/MockLightServer.js.map +1 -1
  340. package/docs/CHANGELOG.md +37 -0
  341. package/docs/DIRECT_BLE.md +359 -0
  342. package/package.json +8 -4
  343. package/scripts/ble-cli-check.ts +129 -0
  344. package/scripts/ble-config-probe.ts +109 -0
  345. package/scripts/ble-effects-check.ts +82 -0
  346. package/scripts/ble-extended-probe.ts +44 -0
  347. package/scripts/ble-fan-check.ts +129 -0
  348. package/scripts/ble-feature-probe.ts +37 -0
  349. package/scripts/ble-followup-check.ts +165 -0
  350. package/scripts/ble-hardware-check.ts +99 -0
  351. package/scripts/ble-live-extended-check.ts +205 -0
  352. package/scripts/ble-non-ota-check.ts +193 -0
  353. package/scripts/ble-probe.ts +45 -0
  354. package/scripts/calibrate-webcam.ts +152 -0
  355. package/scripts/desktop-reference.ts +85 -0
  356. package/scripts/webcam.ts +129 -0
  357. package/dist/__tests__/lightControl.test.d.ts +0 -2
  358. package/dist/__tests__/lightControl.test.d.ts.map +0 -1
  359. package/dist/__tests__/lightControl.test.js +0 -424
  360. package/dist/__tests__/lightControl.test.js.map +0 -1
  361. package/dist/commands/deviceControl/discover.d.ts.map +0 -1
  362. package/dist/commands/deviceControl/discover.js +0 -29
  363. package/dist/commands/deviceControl/discover.js.map +0 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Amaran Light CLI
2
2
 
3
- A command line tool for controlling Aputure Amaran lights via WebSocket connection to the Amaran Desktop application. Not an offical Amaran command line tool.
3
+ A command line tool for controlling Aputure Amaran lights via WebSocket connection to the Amaran Desktop application, or directly over Bluetooth Mesh using the included local BLE daemon. The legacy HTTP daemon from [wesbos/amaran-BLE-control](https://github.com/wesbos/amaran-BLE-control) is also supported. Not an official Amaran command line tool.
4
4
 
5
5
  Also has a circadian lighting command called `auto-cct` that will set the CCT & intensity according to the time of day it is currently at your location, and a service that will run the command every minute to automate it.
6
6
 
@@ -33,8 +33,8 @@ It's not as obvious, but this repo is published on npm too: https://www.npmjs.co
33
33
 
34
34
  ## Prerequisites
35
35
 
36
- - Aputure Amaran Desktop application must be running
37
- - WebSocket server should be accessible (default: ws://localhost:60124)
36
+ - Default direct BLE backend: macOS with Bluetooth permission for Node and a private mesh configuration imported from the previous BLE project. The included daemon listens on `http://127.0.0.1:2708`; Amaran Desktop is not required at runtime.
37
+ - Explicit Desktop backend: Aputure Amaran Desktop must be running with its WebSocket server accessible (default: `ws://localhost:60124`). Select it with `--backend desktop`; `websocket` remains a compatibility alias.
38
38
 
39
39
  ## Library Usage
40
40
 
@@ -82,12 +82,21 @@ registerCommands(program, deps);
82
82
 
83
83
  ## Configuration
84
84
 
85
- Configure the WebSocket URL and other settings:
85
+ Configure the light control backend and other settings:
86
86
 
87
87
  ```bash
88
- # Set WebSocket URL
88
+ # Use the default direct BLE backend
89
+ amaran-cli config --backend ble --ble-url http://localhost:2708
90
+
91
+ # Explicitly use Amaran Desktop
92
+ amaran-cli config --backend desktop
93
+
94
+ # Set the Desktop WebSocket URL
89
95
  amaran-cli config -u ws://localhost:60124
90
96
 
97
+ # If the BLE daemon has http.apiKey configured
98
+ amaran-cli config --ble-api-key my-secret
99
+
91
100
  # Set client ID
92
101
  amaran-cli config -c my-cli-client
93
102
 
@@ -101,21 +110,103 @@ amaran-cli config --lat 40.7128 --lon -74.0060
101
110
  amaran-cli config --show
102
111
  ```
103
112
 
104
- Configuration is stored in `~/.amaran-cli.json`.
113
+ Configuration is stored in the platform config directory used by the CLI; legacy `~/.amaran-cli.json` is still read when no new config exists.
114
+
115
+ You can also select the backend per command without changing config:
116
+
117
+ ```bash
118
+ amaran-cli list --url http://localhost:2708
119
+ amaran-cli cct 5600 -i 80
120
+ amaran-cli list --backend desktop
121
+ ```
122
+
123
+ When `--url` is used with `--backend`, it overrides the endpoint for that backend: an HTTP base URL for `ble`, or a WebSocket URL for `desktop`/`websocket`.
124
+
125
+ Direct BLE is the default when neither the command nor configuration selects a backend. Use `--backend desktop` for Amaran Desktop; the legacy name `--backend websocket` remains accepted. The included daemon supports power, brightness, CCT, 150c G/M and HSI, native effects/trigger requests, fan profiles, named/hex colors through HSI, relative adjustments, local groups/scenes/presets/quickshots with fan settings, and CCT/HSI/scene transitions. Manual lighting changes create a persistent 30-minute circadian override; use `ble override resume` to hand control back sooner. Hardware settings require matching authenticated readback; transient trigger events explicitly lack event confirmation, and library operations confirm local persistence instead.
126
+
127
+ Neither model has native RGB/XY or advanced HSI CCT/G/M. The BLE stack implements all eight native fan modes, including explicit manual RPM control, for individual fixtures, groups and all lights. Every mode requires advertised device support: the tested 150c and 200x S fixtures currently advertise only Smart and Medium. Mode changes are verified by readback; zero reported RPM is not treated as a fault. Active thermal protection blocks changes without restarting the fixture, and stopped-cooling requests require LEDs off or at zero brightness.
128
+
129
+ Optional native mesh groups use verified subscriptions after private Device Key import. Desktop effect presets, quickshots, and workspaces can be previewed and imported without applying lighting. Bounded timelines, local audio-driven brightness and image/camera HSI picking run as cancellable daemon jobs and restore initial settings by default. Provisioning discovery and key-refresh inspection are read-only; full joining/re-keying is not implemented. OTA/firmware updates are intentionally excluded, and unverified dimming-curve writes remain unavailable.
105
130
 
106
- ## Discovery
131
+ ### Direct Bluetooth setup
107
132
 
108
- The CLI can automatically discover the WebSocket endpoint from a running Amaran Desktop application:
133
+ ```bash
134
+ npm ci
135
+ npm run build
136
+
137
+ # One-time import; mesh keys remain in the private platform config directory.
138
+ node dist/cli.js ble import ../amaran-BLE-control/lights.json
139
+
140
+ # Quit Amaran Desktop and pause other lighting automation before initial testing.
141
+ node dist/cli.js ble serve
142
+
143
+ # Alternatively, install a persistent macOS user service.
144
+ node dist/cli.js ble service install
145
+ node dist/cli.js ble service status
146
+
147
+ node dist/cli.js status
148
+ node dist/cli.js cct 3200 desk -i 5
149
+ node dist/cli.js hsi 240 100 5 back
150
+ node dist/cli.js ble gm back 20
151
+ node dist/cli.js ble health
152
+ node dist/cli.js ble dashboard --open
153
+ node dist/cli.js ble import-desktop "/path/to/amaran.db"
154
+ node dist/cli.js intensity 5 all
155
+ node dist/cli.js ble batch brightness --args '{"value":5}' --broadcast
156
+ node dist/cli.js scene save Evening
157
+ node dist/cli.js scene show Evening
158
+ node dist/cli.js fan info all
159
+ node dist/cli.js off
160
+ ```
161
+
162
+ The daemon also serves a local control dashboard at `http://127.0.0.1:2708/dashboard`. It uses the same verified
163
+ BLE API as the CLI for fixtures, groups, power, CCT/G/M, HSI, effects, fans, saved states, transitions, circadian
164
+ overrides, timelines, local media paths, browser camera/microphone sampling, Desktop-library import and mesh
165
+ diagnostics. It is loopback-only, loads no remote code, and does not expose mesh credentials. The dashboard exposes
166
+ the fixtures' full 0-100% brightness range without an artificial output cap. In CCT mode, fixture cards also show
167
+ estimated lux from the configured Kelvin-dependent `maxLux` calibration, scaled by verified brightness. Optional
168
+ `maxLuxByModel` entries for `200x`, `200x-s`, and `150c` override the shared curve per fixture model. Dashboard
169
+ preferences and the last timestamped observed status are stored beside the private BLE configuration as
170
+ `dashboard-settings.json` and `dashboard-status.json`. A circadian panel shows whether the LaunchAgent is loaded and
171
+ recently updating, its latest requested target, current verified fixture output, active curve, weather adjustment
172
+ state, and a hover/touch daily graph of Kelvin, intensity, and estimated lux. The graph uses the same configured
173
+ CCT/intensity bounds as `auto-cct`, while keeping the intensity axis fixed at 0–100% and marking the configured
174
+ maximum with a dotted limit line. The natural intensity curve continues above that line; tooltips show both the
175
+ uncapped schedule and the value the service will actually apply. A separate **Actual sunlight lux (modeled)** curve
176
+ continues beyond the fixtures' measured lux capacity, which is shown as its own dashed reference. The same panel can
177
+ persistently enable or disable the service and edit its curve, live-weather adjustment, interval, location, Kelvin
178
+ bounds, and intensity bounds. Saving immediately recalculates the graph; active weather shows cloud/precipitation
179
+ details and its current intensity, Kelvin, and sunlight-lux difference from clear-sky output.
180
+
181
+ Desktop import previews by default and never changes fixture output. With `--apply`, Desktop quickshots become local
182
+ quickshots, explicit workspace membership becomes local groups, and all eleven supported legacy effect types become
183
+ retargetable local presets. Effect frequency, animation speed, trigger mode, CCT/HSI variants, palettes, saturation,
184
+ brightness, and 150c G/M are converted and validated against the configured fixtures before anything is persisted.
185
+ Use `--allow-partial` only when intentionally accepting a report that contains unsupported or malformed records.
186
+
187
+ These fixtures use whole-percent brightness, 100-K CCT steps, and (150c only) G/M steps of 10. Requests are rounded and verified against the applied values. Omitting CCT brightness or tint preserves the fixture's actual setting, never an 80% brightness default or full-magenta tint. CCT/HSI commands wake the fixture, matching its native behavior; use `off` to put it back to sleep.
188
+
189
+ See [Direct BLE operation and verification](docs/DIRECT_BLE.md) for restart behavior, permissions, protocol findings, webcam checks, and limitations.
190
+
191
+ ## Amaran Desktop compatibility
192
+
193
+ Desktop-only utilities are isolated under the explicit `desktop` namespace. The CLI can discover and save the
194
+ WebSocket endpoint from a running Amaran Desktop application:
109
195
 
110
196
  ```bash
111
197
  # Discover and save WebSocket URL
112
- amaran-cli discover
198
+ amaran-cli desktop discover
113
199
 
114
200
  # Discover with debug output
115
- amaran-cli discover -d
201
+ amaran-cli desktop discover -d
202
+
203
+ # Start a vendor firmware update through Amaran Desktop
204
+ amaran-cli desktop firmware update desk
116
205
  ```
117
206
 
118
- This command uses `lsof` to find the WebSocket port that the Amaran Desktop application is listening on, then saves it to your configuration file for future use.
207
+ Discovery uses `lsof` to find the WebSocket port and saves it for explicit Desktop-backend use. Firmware updates are
208
+ not implemented by the direct BLE daemon. The previous `firmware check` command was removed because it did not query
209
+ update availability and could incorrectly claim that firmware was current.
119
210
 
120
211
  ## Device Identification
121
212
 
@@ -226,6 +317,8 @@ The `auto-cct` command automatically adjusts color temperature based on sunrise/
226
317
  - **Between sunrise and sunset**: Smooth bell curve transition from 2000K/5% → 6500K/100% → 2000K/5%
227
318
 
228
319
  This mimics natural daylight changes throughout the day for more comfortable, circadian-friendly lighting. Both color temperature and brightness follow the same curve, providing natural dimming at dawn/dusk.
320
+ When a configured schedule extends beyond a fixture's advertised CCT range, direct BLE automation clamps the target
321
+ for that fixture instead of failing the entire multi-light update.
229
322
 
230
323
  #### Location Priority
231
324
 
@@ -460,7 +553,7 @@ amaran-cli schedule print --date 2025-12-21
460
553
  # Change time interval (default: 30 minutes)
461
554
  amaran-cli schedule print --interval 15
462
555
 
463
- # Specify which curves to show (default: "all")
556
+ # Specify which curves to show (default: "cie-daylight")
464
557
  amaran-cli schedule print --curve "hann, cie-daylight"
465
558
 
466
559
  # Output as CSV
@@ -501,7 +594,7 @@ amaran-cli schedule graph -W 1920 -H 1080
501
594
  amaran-cli schedule graph --curve cie-daylight
502
595
  amaran-cli schedule graph --curve "perez-daylight, sun-altitude"
503
596
 
504
- # View all available curves on one graph (default)
597
+ # View all available curves on one graph
505
598
  amaran-cli schedule graph --curve all
506
599
 
507
600
  # Preview for a specific date and location
@@ -575,7 +668,8 @@ amaran-cli delete-quickshot "My Scene"
575
668
 
576
669
  All commands support these options:
577
670
 
578
- - `-u, --url <url>`: Override WebSocket URL
671
+ - `-b, --backend <backend>`: Select `ble` (default) or `desktop`; `websocket` is a compatibility alias
672
+ - `-u, --url <url>`: Override the backend endpoint (BLE HTTP URL or Desktop WebSocket URL)
579
673
  - `-c, --client-id <id>`: Override client ID
580
674
  - `-d, --debug`: Enable debug mode
581
675
 
@@ -104,5 +104,32 @@ describe('auto-cct command', () => {
104
104
  expect(setCCT).toHaveBeenCalledWith('400J5-F2C008', 5600, 500, expect.any(Function));
105
105
  expect(disconnect).toHaveBeenCalledTimes(1);
106
106
  });
107
+ test('clamps automatic CCT to each BLE fixture capability', async () => {
108
+ const setAutomaticCCT = vi.fn((_, _cct, _intensity, cb) => {
109
+ cb?.(true, 'ok');
110
+ });
111
+ const controllerStub = {
112
+ getDevices: vi.fn(() => [
113
+ {
114
+ node_id: 'desk',
115
+ device_name: 'Desk',
116
+ backend: 'ble',
117
+ capabilities: { cct_min: 2700, cct_max: 5500 },
118
+ },
119
+ ]),
120
+ setAutomaticCCT,
121
+ disconnect: vi.fn(async () => undefined),
122
+ };
123
+ const program = new Command();
124
+ program.exitOverride();
125
+ registerCommands(program, {
126
+ createController: async () => controllerStub,
127
+ findDevice: () => null,
128
+ asyncCommand: (fn) => (...args) => fn(...args),
129
+ loadConfig: () => ({}),
130
+ });
131
+ await program.parseAsync(['node', 'test', 'auto-cct']);
132
+ expect(setAutomaticCCT).toHaveBeenCalledWith('desk', 5500, 500, expect.any(Function));
133
+ });
107
134
  });
108
135
  //# sourceMappingURL=autoCct.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"autoCct.test.js","sourceRoot":"","sources":["../../src/__tests__/autoCct.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autoCct.test.js","sourceRoot":"","sources":["../../src/__tests__/autoCct.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bleHttpControl.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bleHttpControl.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bleHttpControl.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,230 @@
1
+ import http from 'node:http';
2
+ import { Command } from 'commander';
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
+ import { commandCallbackResult, getLightDevices } from '../commands/cmdUtils.js';
5
+ import registerAutoCct from '../commands/daylightSimulation/autoCct.js';
6
+ import BleHttpController, { trimTrailingSlashes } from '../deviceControl/bleHttpControl.js';
7
+ describe('BleHttpController', () => {
8
+ let server;
9
+ let baseUrl;
10
+ const requests = [];
11
+ const waitForRequests = async (count) => {
12
+ const deadline = Date.now() + 1000;
13
+ while (requests.length < count && Date.now() < deadline) {
14
+ await new Promise((resolve) => setTimeout(resolve, 10));
15
+ }
16
+ };
17
+ beforeEach(async () => {
18
+ requests.length = 0;
19
+ server = http.createServer(async (req, res) => {
20
+ const chunks = [];
21
+ for await (const chunk of req) {
22
+ chunks.push(Buffer.from(chunk));
23
+ }
24
+ const rawBody = Buffer.concat(chunks).toString('utf8');
25
+ requests.push({
26
+ method: req.method,
27
+ url: req.url,
28
+ body: rawBody ? JSON.parse(rawBody) : undefined,
29
+ authorization: req.headers.authorization,
30
+ });
31
+ if (req.url === '/' && req.method === 'GET') {
32
+ res.writeHead(200, { 'content-type': 'application/json' });
33
+ res.end(JSON.stringify({
34
+ ok: true,
35
+ daemon: true,
36
+ protocolVersion: 2,
37
+ connected: true,
38
+ features: { library: true, meshConfig: true, effects: true },
39
+ lights: [
40
+ { key: 'key', name: 'Key Light', mac: 'A4:C1:38:13:41:38', address: 2 },
41
+ { key: 'back', name: 'Back Light', mac: 'A4:C1:38:13:30:86', address: 4 },
42
+ ],
43
+ }));
44
+ return;
45
+ }
46
+ if (req.url === '/lights/key/off' && req.method === 'POST') {
47
+ res.writeHead(204);
48
+ res.end();
49
+ return;
50
+ }
51
+ res.writeHead(200, { 'content-type': 'application/json' });
52
+ res.end(JSON.stringify({ ok: true, result: 'ok' }));
53
+ });
54
+ await new Promise((resolve) => {
55
+ server.listen(0, '127.0.0.1', resolve);
56
+ });
57
+ const address = server.address();
58
+ if (typeof address !== 'object' || !address) {
59
+ throw new Error('test server did not provide an address');
60
+ }
61
+ baseUrl = `http://127.0.0.1:${address.port}`;
62
+ });
63
+ afterEach(async () => {
64
+ await new Promise((resolve, reject) => {
65
+ server.close((error) => (error ? reject(error) : resolve()));
66
+ });
67
+ });
68
+ it('loads BLE daemon lights as CLI light devices', async () => {
69
+ const controller = await BleHttpController.connect(baseUrl);
70
+ expect(controller.getDevices()).toMatchObject([
71
+ {
72
+ node_id: 'key',
73
+ id: 'key',
74
+ device_name: 'Key Light',
75
+ device_type: 'ble-light',
76
+ backend: 'ble',
77
+ },
78
+ {
79
+ node_id: 'back',
80
+ id: 'back',
81
+ device_name: 'Back Light',
82
+ device_type: 'ble-light',
83
+ backend: 'ble',
84
+ },
85
+ ]);
86
+ expect(getLightDevices(controller.getDevices())).toHaveLength(2);
87
+ });
88
+ it('exposes daemon health and detailed local records through read-only methods', async () => {
89
+ const controller = await BleHttpController.connect(baseUrl);
90
+ const health = await new Promise((resolve, reject) => controller.getHealth((success, message, data) => (success ? resolve(data) : reject(new Error(message)))));
91
+ const group = await new Promise((resolve, reject) => controller.getGroup('group:work', (success, message, data) => success ? resolve(data) : reject(new Error(message))));
92
+ const scene = await new Promise((resolve, reject) => controller.getSaved('scenes', 'Evening', (success, message, data) => success ? resolve(data) : reject(new Error(message))));
93
+ expect(health).toMatchObject({
94
+ data: { daemon: true, protocolVersion: 2, connected: true, features: { library: true, meshConfig: true } },
95
+ });
96
+ expect(group).toEqual({ data: 'ok' });
97
+ expect(scene).toEqual({ data: 'ok' });
98
+ expect(requests).toContainEqual({
99
+ method: 'GET',
100
+ url: '/groups/group%3Awork',
101
+ body: undefined,
102
+ authorization: undefined,
103
+ });
104
+ expect(requests).toContainEqual({
105
+ method: 'GET',
106
+ url: '/library/scenes/Evening',
107
+ body: undefined,
108
+ authorization: undefined,
109
+ });
110
+ });
111
+ it('sends supported commands to the BLE HTTP API', async () => {
112
+ const controller = await BleHttpController.connect(baseUrl, 'test-key');
113
+ await controller.setCCTAndIntensityForAllLights(5600, 750);
114
+ controller.setIntensity('key', 250);
115
+ controller.turnLightOff('key');
116
+ await waitForRequests(5);
117
+ expect(requests).toContainEqual({
118
+ method: 'POST',
119
+ url: '/lights/key/cct',
120
+ body: { kelvin: 5600, brightness: 75 },
121
+ authorization: 'Bearer test-key',
122
+ });
123
+ expect(requests).toContainEqual({
124
+ method: 'POST',
125
+ url: '/lights/back/cct',
126
+ body: { kelvin: 5600, brightness: 75 },
127
+ authorization: 'Bearer test-key',
128
+ });
129
+ expect(requests).toContainEqual({
130
+ method: 'POST',
131
+ url: '/lights/key/brightness',
132
+ body: { value: 25 },
133
+ authorization: 'Bearer test-key',
134
+ });
135
+ expect(requests).toContainEqual({
136
+ method: 'POST',
137
+ url: '/lights/key/off',
138
+ body: {},
139
+ authorization: 'Bearer test-key',
140
+ });
141
+ });
142
+ it('routes effect animation, target selection and saved-state transitions', async () => {
143
+ const controller = await BleHttpController.connect(baseUrl);
144
+ await commandCallbackResult((callback) => controller.setEffectAnimationSpeed('back', 4, callback));
145
+ await commandCallbackResult((callback) => controller.saveSaved('scenes', 'Work', ['key'], callback));
146
+ await commandCallbackResult((callback) => controller.replaceSaved('quickshots', 'Workday', undefined, 'all', callback));
147
+ await commandCallbackResult((callback) => controller.recallSaved('presets', 'Portrait', { target: 'back', seconds: 2 }, callback));
148
+ expect(requests).toContainEqual({
149
+ method: 'POST',
150
+ url: '/lights/back/effect-animation-speed',
151
+ body: { value: 4 },
152
+ authorization: undefined,
153
+ });
154
+ expect(requests).toContainEqual({
155
+ method: 'POST',
156
+ url: '/library/scenes',
157
+ body: { name: 'Work', keys: ['key'] },
158
+ authorization: undefined,
159
+ });
160
+ expect(requests).toContainEqual({
161
+ method: 'POST',
162
+ url: '/library/quickshots/Workday',
163
+ body: { keys: 'all' },
164
+ authorization: undefined,
165
+ });
166
+ expect(requests).toContainEqual({
167
+ method: 'POST',
168
+ url: '/library/presets/Portrait/recall',
169
+ body: { target: 'back', seconds: 2 },
170
+ authorization: undefined,
171
+ });
172
+ });
173
+ it('supports auto-cct updates through the BLE backend', async () => {
174
+ const deps = {
175
+ createController: async (url) => BleHttpController.connect(url),
176
+ findDevice: (controller, deviceQuery) => {
177
+ return (controller.getDevices().find((device) => device.node_id === deviceQuery || device.id === deviceQuery) ?? null);
178
+ },
179
+ asyncCommand: (fn) => (...args) => fn(...args),
180
+ loadConfig: () => ({}),
181
+ };
182
+ const program = new Command();
183
+ program.exitOverride();
184
+ registerAutoCct(program, deps);
185
+ await program.parseAsync([
186
+ 'node',
187
+ 'test',
188
+ 'auto-cct',
189
+ 'key',
190
+ '--backend',
191
+ 'ble',
192
+ '--url',
193
+ baseUrl,
194
+ '--lat',
195
+ '40.7128',
196
+ '--lon',
197
+ '-74.0060',
198
+ '--time',
199
+ '2025-06-21T12:00:00-04:00',
200
+ ]);
201
+ expect(requests).toContainEqual({
202
+ method: 'POST',
203
+ url: '/lights/key/cct',
204
+ body: { kelvin: expect.any(Number), brightness: expect.any(Number) },
205
+ authorization: undefined,
206
+ });
207
+ });
208
+ it('surfaces a friendly error when the BLE backend fetch fails', async () => {
209
+ const fetchSpy = vi.spyOn(global, 'fetch').mockRejectedValue(new TypeError('fetch failed'));
210
+ const controller = new BleHttpController(baseUrl);
211
+ await new Promise((resolve) => {
212
+ controller.getDeviceList((success, message) => {
213
+ expect(success).toBe(false);
214
+ expect(message).toContain('Unable to reach BLE backend');
215
+ expect(message).toContain('Make sure the BLE service is running');
216
+ resolve();
217
+ });
218
+ });
219
+ fetchSpy.mockRestore();
220
+ });
221
+ });
222
+ describe('trimTrailingSlashes', () => {
223
+ it('removes trailing slashes without changing the rest of the URL', () => {
224
+ expect(trimTrailingSlashes('http://localhost:2708/')).toBe('http://localhost:2708');
225
+ expect(trimTrailingSlashes('http://localhost:2708///')).toBe('http://localhost:2708');
226
+ expect(trimTrailingSlashes('http://localhost:2708')).toBe('http://localhost:2708');
227
+ expect(trimTrailingSlashes('')).toBe('');
228
+ });
229
+ });
230
+ //# sourceMappingURL=bleHttpControl.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bleHttpControl.test.js","sourceRoot":"","sources":["../../src/__tests__/bleHttpControl.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bleStack.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bleStack.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bleStack.test.ts"],"names":[],"mappings":""}