mikrojs 0.0.0 → 0.0.8

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 (497) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/bin/mikrojs.js +3 -0
  4. package/dist/_exports/ble.d.ts +3 -0
  5. package/dist/_exports/ble.d.ts.map +1 -0
  6. package/dist/_exports/ble.js +2 -0
  7. package/dist/_exports/ble.js.map +1 -0
  8. package/dist/_exports/cbor.d.ts +3 -0
  9. package/dist/_exports/cbor.d.ts.map +1 -0
  10. package/dist/_exports/cbor.js +2 -0
  11. package/dist/_exports/cbor.js.map +1 -0
  12. package/dist/_exports/console.d.ts +2 -0
  13. package/dist/_exports/console.d.ts.map +1 -0
  14. package/dist/_exports/console.js +2 -0
  15. package/dist/_exports/console.js.map +1 -0
  16. package/dist/_exports/env.d.ts +2 -0
  17. package/dist/_exports/env.d.ts.map +1 -0
  18. package/dist/_exports/env.js +2 -0
  19. package/dist/_exports/env.js.map +1 -0
  20. package/dist/_exports/format.d.ts +2 -0
  21. package/dist/_exports/format.d.ts.map +1 -0
  22. package/dist/_exports/format.js +2 -0
  23. package/dist/_exports/format.js.map +1 -0
  24. package/dist/_exports/fs.d.ts +2 -0
  25. package/dist/_exports/fs.d.ts.map +1 -0
  26. package/dist/_exports/fs.js +2 -0
  27. package/dist/_exports/fs.js.map +1 -0
  28. package/dist/_exports/http/helpers.d.ts +3 -0
  29. package/dist/_exports/http/helpers.d.ts.map +1 -0
  30. package/dist/_exports/http/helpers.js +5 -0
  31. package/dist/_exports/http/helpers.js.map +1 -0
  32. package/dist/_exports/http/request.d.ts +4 -0
  33. package/dist/_exports/http/request.d.ts.map +1 -0
  34. package/dist/_exports/http/request.js +10 -0
  35. package/dist/_exports/http/request.js.map +1 -0
  36. package/dist/_exports/i2c.d.ts +2 -0
  37. package/dist/_exports/i2c.d.ts.map +1 -0
  38. package/dist/_exports/i2c.js +2 -0
  39. package/dist/_exports/i2c.js.map +1 -0
  40. package/dist/_exports/index.d.ts +61 -0
  41. package/dist/_exports/index.d.ts.map +1 -0
  42. package/dist/_exports/index.js +4 -0
  43. package/dist/_exports/index.js.map +1 -0
  44. package/dist/_exports/inspect.d.ts +2 -0
  45. package/dist/_exports/inspect.d.ts.map +1 -0
  46. package/dist/_exports/inspect.js +2 -0
  47. package/dist/_exports/inspect.js.map +1 -0
  48. package/dist/_exports/kv/nvs.d.ts +3 -0
  49. package/dist/_exports/kv/nvs.d.ts.map +1 -0
  50. package/dist/_exports/kv/nvs.js +2 -0
  51. package/dist/_exports/kv/nvs.js.map +1 -0
  52. package/dist/_exports/kv/rtc.d.ts +3 -0
  53. package/dist/_exports/kv/rtc.d.ts.map +1 -0
  54. package/dist/_exports/kv/rtc.js +2 -0
  55. package/dist/_exports/kv/rtc.js.map +1 -0
  56. package/dist/_exports/neopixel.d.ts +2 -0
  57. package/dist/_exports/neopixel.d.ts.map +1 -0
  58. package/dist/_exports/neopixel.js +2 -0
  59. package/dist/_exports/neopixel.js.map +1 -0
  60. package/dist/_exports/pin.d.ts +2 -0
  61. package/dist/_exports/pin.d.ts.map +1 -0
  62. package/dist/_exports/pin.js +2 -0
  63. package/dist/_exports/pin.js.map +1 -0
  64. package/dist/_exports/pwm.d.ts +2 -0
  65. package/dist/_exports/pwm.d.ts.map +1 -0
  66. package/dist/_exports/pwm.js +2 -0
  67. package/dist/_exports/pwm.js.map +1 -0
  68. package/dist/_exports/reader.d.ts +2 -0
  69. package/dist/_exports/reader.d.ts.map +1 -0
  70. package/dist/_exports/reader.js +2 -0
  71. package/dist/_exports/reader.js.map +1 -0
  72. package/dist/_exports/result.d.ts +2 -0
  73. package/dist/_exports/result.d.ts.map +1 -0
  74. package/dist/_exports/result.js +2 -0
  75. package/dist/_exports/result.js.map +1 -0
  76. package/dist/_exports/schema.d.ts +2 -0
  77. package/dist/_exports/schema.d.ts.map +1 -0
  78. package/dist/_exports/schema.js +2 -0
  79. package/dist/_exports/schema.js.map +1 -0
  80. package/dist/_exports/sim.d.ts +199 -0
  81. package/dist/_exports/sim.d.ts.map +1 -0
  82. package/dist/_exports/sim.js +8 -0
  83. package/dist/_exports/sim.js.map +1 -0
  84. package/dist/_exports/sleep.d.ts +2 -0
  85. package/dist/_exports/sleep.d.ts.map +1 -0
  86. package/dist/_exports/sleep.js +2 -0
  87. package/dist/_exports/sleep.js.map +1 -0
  88. package/dist/_exports/sntp.d.ts +3 -0
  89. package/dist/_exports/sntp.d.ts.map +1 -0
  90. package/dist/_exports/sntp.js +2 -0
  91. package/dist/_exports/sntp.js.map +1 -0
  92. package/dist/_exports/spi.d.ts +2 -0
  93. package/dist/_exports/spi.d.ts.map +1 -0
  94. package/dist/_exports/spi.js +2 -0
  95. package/dist/_exports/spi.js.map +1 -0
  96. package/dist/_exports/stdio.d.ts +2 -0
  97. package/dist/_exports/stdio.d.ts.map +1 -0
  98. package/dist/_exports/stdio.js +2 -0
  99. package/dist/_exports/stdio.js.map +1 -0
  100. package/dist/_exports/stream.d.ts +2 -0
  101. package/dist/_exports/stream.d.ts.map +1 -0
  102. package/dist/_exports/stream.js +2 -0
  103. package/dist/_exports/stream.js.map +1 -0
  104. package/dist/_exports/sys.d.ts +2 -0
  105. package/dist/_exports/sys.d.ts.map +1 -0
  106. package/dist/_exports/sys.js +2 -0
  107. package/dist/_exports/sys.js.map +1 -0
  108. package/dist/_exports/test.d.ts +2 -0
  109. package/dist/_exports/test.d.ts.map +1 -0
  110. package/dist/_exports/test.js +2 -0
  111. package/dist/_exports/test.js.map +1 -0
  112. package/dist/_exports/uart.d.ts +2 -0
  113. package/dist/_exports/uart.d.ts.map +1 -0
  114. package/dist/_exports/uart.js +2 -0
  115. package/dist/_exports/uart.js.map +1 -0
  116. package/dist/_exports/wifi.d.ts +3 -0
  117. package/dist/_exports/wifi.d.ts.map +1 -0
  118. package/dist/_exports/wifi.js +2 -0
  119. package/dist/_exports/wifi.js.map +1 -0
  120. package/dist/cli/cli.d.ts +3 -0
  121. package/dist/cli/cli.d.ts.map +1 -0
  122. package/dist/cli/cli.js +215 -0
  123. package/dist/cli/cli.js.map +1 -0
  124. package/dist/cli/cliWrapper.d.ts +3 -0
  125. package/dist/cli/cliWrapper.d.ts.map +1 -0
  126. package/dist/cli/cliWrapper.js +40 -0
  127. package/dist/cli/cliWrapper.js.map +1 -0
  128. package/dist/cli/commands/build-runtime.d.ts +14 -0
  129. package/dist/cli/commands/build-runtime.d.ts.map +1 -0
  130. package/dist/cli/commands/build-runtime.js +122 -0
  131. package/dist/cli/commands/build-runtime.js.map +1 -0
  132. package/dist/cli/commands/build.d.ts +31 -0
  133. package/dist/cli/commands/build.d.ts.map +1 -0
  134. package/dist/cli/commands/build.js +145 -0
  135. package/dist/cli/commands/build.js.map +1 -0
  136. package/dist/cli/commands/clean.d.ts +16 -0
  137. package/dist/cli/commands/clean.d.ts.map +1 -0
  138. package/dist/cli/commands/clean.js +148 -0
  139. package/dist/cli/commands/clean.js.map +1 -0
  140. package/dist/cli/commands/console.d.ts +19 -0
  141. package/dist/cli/commands/console.d.ts.map +1 -0
  142. package/dist/cli/commands/console.js +32 -0
  143. package/dist/cli/commands/console.js.map +1 -0
  144. package/dist/cli/commands/deploy.d.ts +63 -0
  145. package/dist/cli/commands/deploy.d.ts.map +1 -0
  146. package/dist/cli/commands/deploy.js +242 -0
  147. package/dist/cli/commands/deploy.js.map +1 -0
  148. package/dist/cli/commands/dev.d.ts +41 -0
  149. package/dist/cli/commands/dev.d.ts.map +1 -0
  150. package/dist/cli/commands/dev.js +170 -0
  151. package/dist/cli/commands/dev.js.map +1 -0
  152. package/dist/cli/commands/docs.d.ts +7 -0
  153. package/dist/cli/commands/docs.d.ts.map +1 -0
  154. package/dist/cli/commands/docs.js +20 -0
  155. package/dist/cli/commands/docs.js.map +1 -0
  156. package/dist/cli/commands/env.d.ts +59 -0
  157. package/dist/cli/commands/env.d.ts.map +1 -0
  158. package/dist/cli/commands/env.js +257 -0
  159. package/dist/cli/commands/env.js.map +1 -0
  160. package/dist/cli/commands/erase.d.ts +18 -0
  161. package/dist/cli/commands/erase.d.ts.map +1 -0
  162. package/dist/cli/commands/erase.js +90 -0
  163. package/dist/cli/commands/erase.js.map +1 -0
  164. package/dist/cli/commands/flash.d.ts +30 -0
  165. package/dist/cli/commands/flash.d.ts.map +1 -0
  166. package/dist/cli/commands/flash.js +243 -0
  167. package/dist/cli/commands/flash.js.map +1 -0
  168. package/dist/cli/commands/home.d.ts +7 -0
  169. package/dist/cli/commands/home.d.ts.map +1 -0
  170. package/dist/cli/commands/home.js +20 -0
  171. package/dist/cli/commands/home.js.map +1 -0
  172. package/dist/cli/commands/ls.d.ts +17 -0
  173. package/dist/cli/commands/ls.d.ts.map +1 -0
  174. package/dist/cli/commands/ls.js +62 -0
  175. package/dist/cli/commands/ls.js.map +1 -0
  176. package/dist/cli/commands/sim/clean.d.ts +7 -0
  177. package/dist/cli/commands/sim/clean.d.ts.map +1 -0
  178. package/dist/cli/commands/sim/clean.js +34 -0
  179. package/dist/cli/commands/sim/clean.js.map +1 -0
  180. package/dist/cli/commands/sim/deploy.d.ts +46 -0
  181. package/dist/cli/commands/sim/deploy.d.ts.map +1 -0
  182. package/dist/cli/commands/sim/deploy.js +127 -0
  183. package/dist/cli/commands/sim/deploy.js.map +1 -0
  184. package/dist/cli/commands/sim/dev.d.ts +52 -0
  185. package/dist/cli/commands/sim/dev.d.ts.map +1 -0
  186. package/dist/cli/commands/sim/dev.js +380 -0
  187. package/dist/cli/commands/sim/dev.js.map +1 -0
  188. package/dist/cli/commands/sim/env.d.ts +56 -0
  189. package/dist/cli/commands/sim/env.d.ts.map +1 -0
  190. package/dist/cli/commands/sim/env.js +204 -0
  191. package/dist/cli/commands/sim/env.js.map +1 -0
  192. package/dist/cli/commands/sim/profile.d.ts +67 -0
  193. package/dist/cli/commands/sim/profile.d.ts.map +1 -0
  194. package/dist/cli/commands/sim/profile.js +356 -0
  195. package/dist/cli/commands/sim/profile.js.map +1 -0
  196. package/dist/cli/commands/sim/repl.d.ts +16 -0
  197. package/dist/cli/commands/sim/repl.d.ts.map +1 -0
  198. package/dist/cli/commands/sim/repl.js +119 -0
  199. package/dist/cli/commands/sim/repl.js.map +1 -0
  200. package/dist/cli/commands/sim/reset.d.ts +11 -0
  201. package/dist/cli/commands/sim/reset.d.ts.map +1 -0
  202. package/dist/cli/commands/sim/reset.js +59 -0
  203. package/dist/cli/commands/sim/reset.js.map +1 -0
  204. package/dist/cli/commands/sim/scaffold.d.ts +11 -0
  205. package/dist/cli/commands/sim/scaffold.d.ts.map +1 -0
  206. package/dist/cli/commands/sim/scaffold.js +41 -0
  207. package/dist/cli/commands/sim/scaffold.js.map +1 -0
  208. package/dist/cli/commands/sim/test.d.ts +49 -0
  209. package/dist/cli/commands/sim/test.d.ts.map +1 -0
  210. package/dist/cli/commands/sim/test.js +364 -0
  211. package/dist/cli/commands/sim/test.js.map +1 -0
  212. package/dist/cli/commands/sim.d.ts +228 -0
  213. package/dist/cli/commands/sim.d.ts.map +1 -0
  214. package/dist/cli/commands/sim.js +69 -0
  215. package/dist/cli/commands/sim.js.map +1 -0
  216. package/dist/cli/commands/tail.d.ts +14 -0
  217. package/dist/cli/commands/tail.d.ts.map +1 -0
  218. package/dist/cli/commands/tail.js +50 -0
  219. package/dist/cli/commands/tail.js.map +1 -0
  220. package/dist/cli/commands/test.d.ts +39 -0
  221. package/dist/cli/commands/test.d.ts.map +1 -0
  222. package/dist/cli/commands/test.js +432 -0
  223. package/dist/cli/commands/test.js.map +1 -0
  224. package/dist/cli/components/DevicePicker.d.ts +9 -0
  225. package/dist/cli/components/DevicePicker.d.ts.map +1 -0
  226. package/dist/cli/components/DevicePicker.js +71 -0
  227. package/dist/cli/components/DevicePicker.js.map +1 -0
  228. package/dist/cli/components/EnvEditor.d.ts +12 -0
  229. package/dist/cli/components/EnvEditor.d.ts.map +1 -0
  230. package/dist/cli/components/EnvEditor.js +201 -0
  231. package/dist/cli/components/EnvEditor.js.map +1 -0
  232. package/dist/cli/components/TextInput.d.ts +28 -0
  233. package/dist/cli/components/TextInput.d.ts.map +1 -0
  234. package/dist/cli/components/TextInput.js +73 -0
  235. package/dist/cli/components/TextInput.js.map +1 -0
  236. package/dist/cli/components/TitledBox.d.ts +27 -0
  237. package/dist/cli/components/TitledBox.d.ts.map +1 -0
  238. package/dist/cli/components/TitledBox.js +111 -0
  239. package/dist/cli/components/TitledBox.js.map +1 -0
  240. package/dist/cli/hooks/useDevices.d.ts +23 -0
  241. package/dist/cli/hooks/useDevices.d.ts.map +1 -0
  242. package/dist/cli/hooks/useDevices.js +19 -0
  243. package/dist/cli/hooks/useDevices.js.map +1 -0
  244. package/dist/cli/lib/RenderAndExit.d.ts +6 -0
  245. package/dist/cli/lib/RenderAndExit.d.ts.map +1 -0
  246. package/dist/cli/lib/RenderAndExit.js +8 -0
  247. package/dist/cli/lib/RenderAndExit.js.map +1 -0
  248. package/dist/cli/lib/Spinner.d.ts +11 -0
  249. package/dist/cli/lib/Spinner.d.ts.map +1 -0
  250. package/dist/cli/lib/Spinner.js +22 -0
  251. package/dist/cli/lib/Spinner.js.map +1 -0
  252. package/dist/cli/lib/agent.d.ts +38 -0
  253. package/dist/cli/lib/agent.d.ts.map +1 -0
  254. package/dist/cli/lib/agent.js +87 -0
  255. package/dist/cli/lib/agent.js.map +1 -0
  256. package/dist/cli/lib/boards.d.ts +23 -0
  257. package/dist/cli/lib/boards.d.ts.map +1 -0
  258. package/dist/cli/lib/boards.js +67 -0
  259. package/dist/cli/lib/boards.js.map +1 -0
  260. package/dist/cli/lib/build.d.ts +47 -0
  261. package/dist/cli/lib/build.d.ts.map +1 -0
  262. package/dist/cli/lib/build.js +533 -0
  263. package/dist/cli/lib/build.js.map +1 -0
  264. package/dist/cli/lib/connectSim.d.ts +21 -0
  265. package/dist/cli/lib/connectSim.d.ts.map +1 -0
  266. package/dist/cli/lib/connectSim.js +20 -0
  267. package/dist/cli/lib/connectSim.js.map +1 -0
  268. package/dist/cli/lib/deploy.d.ts +42 -0
  269. package/dist/cli/lib/deploy.d.ts.map +1 -0
  270. package/dist/cli/lib/deploy.js +121 -0
  271. package/dist/cli/lib/deploy.js.map +1 -0
  272. package/dist/cli/lib/deployProgress.d.ts +8 -0
  273. package/dist/cli/lib/deployProgress.d.ts.map +1 -0
  274. package/dist/cli/lib/deployProgress.js +32 -0
  275. package/dist/cli/lib/deployProgress.js.map +1 -0
  276. package/dist/cli/lib/dotenv.d.ts +16 -0
  277. package/dist/cli/lib/dotenv.d.ts.map +1 -0
  278. package/dist/cli/lib/dotenv.js +33 -0
  279. package/dist/cli/lib/dotenv.js.map +1 -0
  280. package/dist/cli/lib/esbuild.d.ts +7 -0
  281. package/dist/cli/lib/esbuild.d.ts.map +1 -0
  282. package/dist/cli/lib/esbuild.js +15 -0
  283. package/dist/cli/lib/esbuild.js.map +1 -0
  284. package/dist/cli/lib/esptool.d.ts +41 -0
  285. package/dist/cli/lib/esptool.d.ts.map +1 -0
  286. package/dist/cli/lib/esptool.js +43 -0
  287. package/dist/cli/lib/esptool.js.map +1 -0
  288. package/dist/cli/lib/firmware.d.ts +24 -0
  289. package/dist/cli/lib/firmware.d.ts.map +1 -0
  290. package/dist/cli/lib/firmware.js +406 -0
  291. package/dist/cli/lib/firmware.js.map +1 -0
  292. package/dist/cli/lib/firmwareCompat.d.ts +19 -0
  293. package/dist/cli/lib/firmwareCompat.d.ts.map +1 -0
  294. package/dist/cli/lib/firmwareCompat.js +31 -0
  295. package/dist/cli/lib/firmwareCompat.js.map +1 -0
  296. package/dist/cli/lib/heapBaseline.d.ts +15 -0
  297. package/dist/cli/lib/heapBaseline.d.ts.map +1 -0
  298. package/dist/cli/lib/heapBaseline.js +39 -0
  299. package/dist/cli/lib/heapBaseline.js.map +1 -0
  300. package/dist/cli/lib/ink-table/index.d.ts +88 -0
  301. package/dist/cli/lib/ink-table/index.d.ts.map +1 -0
  302. package/dist/cli/lib/ink-table/index.js +217 -0
  303. package/dist/cli/lib/ink-table/index.js.map +1 -0
  304. package/dist/cli/lib/loadMikroConfig.d.ts +7 -0
  305. package/dist/cli/lib/loadMikroConfig.d.ts.map +1 -0
  306. package/dist/cli/lib/loadMikroConfig.js +26 -0
  307. package/dist/cli/lib/loadMikroConfig.js.map +1 -0
  308. package/dist/cli/lib/minify.d.ts +3 -0
  309. package/dist/cli/lib/minify.d.ts.map +1 -0
  310. package/dist/cli/lib/minify.js +89 -0
  311. package/dist/cli/lib/minify.js.map +1 -0
  312. package/dist/cli/lib/openSim.d.ts +29 -0
  313. package/dist/cli/lib/openSim.d.ts.map +1 -0
  314. package/dist/cli/lib/openSim.js +32 -0
  315. package/dist/cli/lib/openSim.js.map +1 -0
  316. package/dist/cli/lib/ospawn.d.ts +34 -0
  317. package/dist/cli/lib/ospawn.d.ts.map +1 -0
  318. package/dist/cli/lib/ospawn.js +90 -0
  319. package/dist/cli/lib/ospawn.js.map +1 -0
  320. package/dist/cli/lib/parseMinifier.d.ts +10 -0
  321. package/dist/cli/lib/parseMinifier.d.ts.map +1 -0
  322. package/dist/cli/lib/parseMinifier.js +49 -0
  323. package/dist/cli/lib/parseMinifier.js.map +1 -0
  324. package/dist/cli/lib/parseSize.d.ts +6 -0
  325. package/dist/cli/lib/parseSize.d.ts.map +1 -0
  326. package/dist/cli/lib/parseSize.js +25 -0
  327. package/dist/cli/lib/parseSize.js.map +1 -0
  328. package/dist/cli/lib/projectRoot.d.ts +11 -0
  329. package/dist/cli/lib/projectRoot.d.ts.map +1 -0
  330. package/dist/cli/lib/projectRoot.js +28 -0
  331. package/dist/cli/lib/projectRoot.js.map +1 -0
  332. package/dist/cli/lib/protocol.d.ts +144 -0
  333. package/dist/cli/lib/protocol.d.ts.map +1 -0
  334. package/dist/cli/lib/protocol.js +385 -0
  335. package/dist/cli/lib/protocol.js.map +1 -0
  336. package/dist/cli/lib/recover.d.ts +25 -0
  337. package/dist/cli/lib/recover.d.ts.map +1 -0
  338. package/dist/cli/lib/recover.js +144 -0
  339. package/dist/cli/lib/recover.js.map +1 -0
  340. package/dist/cli/lib/resolveEntry.d.ts +7 -0
  341. package/dist/cli/lib/resolveEntry.d.ts.map +1 -0
  342. package/dist/cli/lib/resolveEntry.js +30 -0
  343. package/dist/cli/lib/resolveEntry.js.map +1 -0
  344. package/dist/cli/lib/runHooks.d.ts +34 -0
  345. package/dist/cli/lib/runHooks.d.ts.map +1 -0
  346. package/dist/cli/lib/runHooks.js +90 -0
  347. package/dist/cli/lib/runHooks.js.map +1 -0
  348. package/dist/cli/lib/serial/InkReplConsole.d.ts +27 -0
  349. package/dist/cli/lib/serial/InkReplConsole.d.ts.map +1 -0
  350. package/dist/cli/lib/serial/InkReplConsole.js +24 -0
  351. package/dist/cli/lib/serial/InkReplConsole.js.map +1 -0
  352. package/dist/cli/lib/serial/InkReplMode.d.ts +38 -0
  353. package/dist/cli/lib/serial/InkReplMode.d.ts.map +1 -0
  354. package/dist/cli/lib/serial/InkReplMode.js +90 -0
  355. package/dist/cli/lib/serial/InkReplMode.js.map +1 -0
  356. package/dist/cli/lib/serial/ReplConsole.d.ts +21 -0
  357. package/dist/cli/lib/serial/ReplConsole.d.ts.map +1 -0
  358. package/dist/cli/lib/serial/ReplConsole.js +249 -0
  359. package/dist/cli/lib/serial/ReplConsole.js.map +1 -0
  360. package/dist/cli/lib/serial/devSession.d.ts +57 -0
  361. package/dist/cli/lib/serial/devSession.d.ts.map +1 -0
  362. package/dist/cli/lib/serial/devSession.js +160 -0
  363. package/dist/cli/lib/serial/devSession.js.map +1 -0
  364. package/dist/cli/lib/serial/dispatchReplCommand.d.ts +25 -0
  365. package/dist/cli/lib/serial/dispatchReplCommand.d.ts.map +1 -0
  366. package/dist/cli/lib/serial/dispatchReplCommand.js +27 -0
  367. package/dist/cli/lib/serial/dispatchReplCommand.js.map +1 -0
  368. package/dist/cli/lib/serial/openSession.d.ts +28 -0
  369. package/dist/cli/lib/serial/openSession.d.ts.map +1 -0
  370. package/dist/cli/lib/serial/openSession.js +48 -0
  371. package/dist/cli/lib/serial/openSession.js.map +1 -0
  372. package/dist/cli/lib/serial/replStateMachine.d.ts +169 -0
  373. package/dist/cli/lib/serial/replStateMachine.d.ts.map +1 -0
  374. package/dist/cli/lib/serial/replStateMachine.js +657 -0
  375. package/dist/cli/lib/serial/replStateMachine.js.map +1 -0
  376. package/dist/cli/lib/serial/runAgentRepl.d.ts +33 -0
  377. package/dist/cli/lib/serial/runAgentRepl.d.ts.map +1 -0
  378. package/dist/cli/lib/serial/runAgentRepl.js +80 -0
  379. package/dist/cli/lib/serial/runAgentRepl.js.map +1 -0
  380. package/dist/cli/lib/session.d.ts +163 -0
  381. package/dist/cli/lib/session.d.ts.map +1 -0
  382. package/dist/cli/lib/session.js +490 -0
  383. package/dist/cli/lib/session.js.map +1 -0
  384. package/dist/cli/lib/simConfig.d.ts +15 -0
  385. package/dist/cli/lib/simConfig.d.ts.map +1 -0
  386. package/dist/cli/lib/simConfig.js +25 -0
  387. package/dist/cli/lib/simConfig.js.map +1 -0
  388. package/dist/cli/lib/simPid.d.ts +30 -0
  389. package/dist/cli/lib/simPid.d.ts.map +1 -0
  390. package/dist/cli/lib/simPid.js +120 -0
  391. package/dist/cli/lib/simPid.js.map +1 -0
  392. package/dist/cli/lib/simTransport.d.ts +17 -0
  393. package/dist/cli/lib/simTransport.d.ts.map +1 -0
  394. package/dist/cli/lib/simTransport.js +80 -0
  395. package/dist/cli/lib/simTransport.js.map +1 -0
  396. package/dist/cli/lib/testRunner.d.ts +86 -0
  397. package/dist/cli/lib/testRunner.d.ts.map +1 -0
  398. package/dist/cli/lib/testRunner.js +469 -0
  399. package/dist/cli/lib/testRunner.js.map +1 -0
  400. package/dist/cli/lib/transport.d.ts +34 -0
  401. package/dist/cli/lib/transport.d.ts.map +1 -0
  402. package/dist/cli/lib/transport.js +117 -0
  403. package/dist/cli/lib/transport.js.map +1 -0
  404. package/dist/cli/lib/useObservable.d.ts +4 -0
  405. package/dist/cli/lib/useObservable.d.ts.map +1 -0
  406. package/dist/cli/lib/useObservable.js +22 -0
  407. package/dist/cli/lib/useObservable.js.map +1 -0
  408. package/dist/cli/lib/watcher.d.ts +10 -0
  409. package/dist/cli/lib/watcher.d.ts.map +1 -0
  410. package/dist/cli/lib/watcher.js +34 -0
  411. package/dist/cli/lib/watcher.js.map +1 -0
  412. package/dist/constants.d.ts +13 -0
  413. package/dist/constants.d.ts.map +1 -0
  414. package/dist/constants.js +27 -0
  415. package/dist/constants.js.map +1 -0
  416. package/dist/simulator/builtins/ble.d.ts +3 -0
  417. package/dist/simulator/builtins/ble.d.ts.map +1 -0
  418. package/dist/simulator/builtins/ble.js +46 -0
  419. package/dist/simulator/builtins/ble.js.map +1 -0
  420. package/dist/simulator/builtins/console.d.ts +8 -0
  421. package/dist/simulator/builtins/console.d.ts.map +1 -0
  422. package/dist/simulator/builtins/console.js +24 -0
  423. package/dist/simulator/builtins/console.js.map +1 -0
  424. package/dist/simulator/builtins/http.d.ts +3 -0
  425. package/dist/simulator/builtins/http.d.ts.map +1 -0
  426. package/dist/simulator/builtins/http.js +90 -0
  427. package/dist/simulator/builtins/http.js.map +1 -0
  428. package/dist/simulator/builtins/i2c.d.ts +3 -0
  429. package/dist/simulator/builtins/i2c.d.ts.map +1 -0
  430. package/dist/simulator/builtins/i2c.js +17 -0
  431. package/dist/simulator/builtins/i2c.js.map +1 -0
  432. package/dist/simulator/builtins/index.d.ts +7 -0
  433. package/dist/simulator/builtins/index.d.ts.map +1 -0
  434. package/dist/simulator/builtins/index.js +49 -0
  435. package/dist/simulator/builtins/index.js.map +1 -0
  436. package/dist/simulator/builtins/kv.d.ts +3 -0
  437. package/dist/simulator/builtins/kv.d.ts.map +1 -0
  438. package/dist/simulator/builtins/kv.js +39 -0
  439. package/dist/simulator/builtins/kv.js.map +1 -0
  440. package/dist/simulator/builtins/neopixel.d.ts +3 -0
  441. package/dist/simulator/builtins/neopixel.d.ts.map +1 -0
  442. package/dist/simulator/builtins/neopixel.js +15 -0
  443. package/dist/simulator/builtins/neopixel.js.map +1 -0
  444. package/dist/simulator/builtins/nvs-kv.d.ts +3 -0
  445. package/dist/simulator/builtins/nvs-kv.d.ts.map +1 -0
  446. package/dist/simulator/builtins/nvs-kv.js +69 -0
  447. package/dist/simulator/builtins/nvs-kv.js.map +1 -0
  448. package/dist/simulator/builtins/pin.d.ts +3 -0
  449. package/dist/simulator/builtins/pin.d.ts.map +1 -0
  450. package/dist/simulator/builtins/pin.js +32 -0
  451. package/dist/simulator/builtins/pin.js.map +1 -0
  452. package/dist/simulator/builtins/pwm.d.ts +3 -0
  453. package/dist/simulator/builtins/pwm.d.ts.map +1 -0
  454. package/dist/simulator/builtins/pwm.js +31 -0
  455. package/dist/simulator/builtins/pwm.js.map +1 -0
  456. package/dist/simulator/builtins/sleep.d.ts +3 -0
  457. package/dist/simulator/builtins/sleep.d.ts.map +1 -0
  458. package/dist/simulator/builtins/sleep.js +33 -0
  459. package/dist/simulator/builtins/sleep.js.map +1 -0
  460. package/dist/simulator/builtins/sntp.d.ts +3 -0
  461. package/dist/simulator/builtins/sntp.d.ts.map +1 -0
  462. package/dist/simulator/builtins/sntp.js +14 -0
  463. package/dist/simulator/builtins/sntp.js.map +1 -0
  464. package/dist/simulator/builtins/spi.d.ts +3 -0
  465. package/dist/simulator/builtins/spi.d.ts.map +1 -0
  466. package/dist/simulator/builtins/spi.js +16 -0
  467. package/dist/simulator/builtins/spi.js.map +1 -0
  468. package/dist/simulator/builtins/types.d.ts +24 -0
  469. package/dist/simulator/builtins/types.d.ts.map +1 -0
  470. package/dist/simulator/builtins/types.js +2 -0
  471. package/dist/simulator/builtins/types.js.map +1 -0
  472. package/dist/simulator/builtins/uart.d.ts +3 -0
  473. package/dist/simulator/builtins/uart.d.ts.map +1 -0
  474. package/dist/simulator/builtins/uart.js +22 -0
  475. package/dist/simulator/builtins/uart.js.map +1 -0
  476. package/dist/simulator/builtins/wifi.d.ts +3 -0
  477. package/dist/simulator/builtins/wifi.d.ts.map +1 -0
  478. package/dist/simulator/builtins/wifi.js +55 -0
  479. package/dist/simulator/builtins/wifi.js.map +1 -0
  480. package/dist/simulator/devRunner.d.ts +41 -0
  481. package/dist/simulator/devRunner.d.ts.map +1 -0
  482. package/dist/simulator/devRunner.js +201 -0
  483. package/dist/simulator/devRunner.js.map +1 -0
  484. package/dist/simulator/loadSimStubs.d.ts +15 -0
  485. package/dist/simulator/loadSimStubs.d.ts.map +1 -0
  486. package/dist/simulator/loadSimStubs.js +54 -0
  487. package/dist/simulator/loadSimStubs.js.map +1 -0
  488. package/dist/simulator/simProcess.d.ts +11 -0
  489. package/dist/simulator/simProcess.d.ts.map +1 -0
  490. package/dist/simulator/simProcess.js +957 -0
  491. package/dist/simulator/simProcess.js.map +1 -0
  492. package/dist/simulator/simTemplates.d.ts +6 -0
  493. package/dist/simulator/simTemplates.d.ts.map +1 -0
  494. package/dist/simulator/simTemplates.js +21 -0
  495. package/dist/simulator/simTemplates.js.map +1 -0
  496. package/package.json +123 -2
  497. package/runtime.d.ts +95 -0
@@ -0,0 +1,469 @@
1
+ import { existsSync, readFileSync, statSync } from 'node:fs';
2
+ import { glob } from 'node:fs/promises';
3
+ import * as pathlib from 'node:path';
4
+ import { catchError, firstValueFrom, last, lastValueFrom, of, scan, takeWhile, tap, timeout, } from 'rxjs';
5
+ import { buildTests } from './build.js';
6
+ import { collectFiles } from './deploy.js';
7
+ import { readBaseline, writeBaseline } from './heapBaseline.js';
8
+ /**
9
+ * Resolve the deploy root directory for a test run.
10
+ *
11
+ * Firmware and sim deploy-done atomically promote only `<staging>/app/` to the
12
+ * live app dir; anything outside that subtree is dropped. So the build output
13
+ * must live under an `app/` root that matches the user's project convention.
14
+ *
15
+ * We derive this from the package.json "main" field (e.g. `./app/main.ts` →
16
+ * `app`). Fall back to `app` if main is missing, matching the convention used
17
+ * by every example in this repo.
18
+ */
19
+ function resolveAppRoot(cwd) {
20
+ const pkgPath = pathlib.join(cwd, 'package.json');
21
+ if (existsSync(pkgPath)) {
22
+ try {
23
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
24
+ if (typeof pkg.main === 'string') {
25
+ const rel = pathlib.relative(cwd, pathlib.resolve(cwd, pkg.main));
26
+ const dir = pathlib.dirname(rel);
27
+ if (dir && dir !== '.')
28
+ return dir;
29
+ }
30
+ }
31
+ catch {
32
+ // Fall through to default
33
+ }
34
+ }
35
+ return 'app';
36
+ }
37
+ /**
38
+ * Resolve test files from a list of patterns. Each pattern may be:
39
+ * - an explicit path to an existing file (included directly)
40
+ * - a glob pattern (expanded against cwd, excluding node_modules/build)
41
+ *
42
+ * With no patterns, falls back to the default `**\/*.test.ts` glob. Patterns
43
+ * that match nothing throw — a typo in a path shouldn't silently run zero
44
+ * tests.
45
+ */
46
+ export async function discoverTestFiles(cwd, patterns = []) {
47
+ const effective = patterns.length === 0 ? ['**/*.test.ts'] : patterns;
48
+ const results = new Set();
49
+ for (const pattern of effective) {
50
+ const abs = pathlib.resolve(cwd, pattern);
51
+ if (existsSync(abs) && statSync(abs).isFile()) {
52
+ results.add(abs);
53
+ continue;
54
+ }
55
+ let matched = 0;
56
+ for await (const m of glob(pattern, { cwd, exclude: ['node_modules/**', 'build/**'] })) {
57
+ results.add(pathlib.resolve(cwd, m));
58
+ matched++;
59
+ }
60
+ if (matched === 0) {
61
+ throw new Error(`No test files matched: ${pattern}`);
62
+ }
63
+ }
64
+ return Array.from(results).sort();
65
+ }
66
+ /**
67
+ * Build the test manifest, deploy once, and observe the device supervisor
68
+ * stream as each test file runs in its own fresh runtime. Returns one
69
+ * TestFileResult per input, with heap-baseline bookkeeping applied.
70
+ */
71
+ export async function runTestManifest(session, testFiles, options, cb = {}) {
72
+ const cwd = process.cwd();
73
+ const rootDir = resolveAppRoot(cwd);
74
+ const relPaths = testFiles.map((f) => pathlib.relative(cwd, f));
75
+ cb.log?.('Building test manifest...');
76
+ await lastValueFrom(buildTests(relPaths, options.buildDir, {
77
+ minify: options.minify,
78
+ bytecode: options.bytecode,
79
+ minifier: options.minifier,
80
+ minifyLevel: options.minifyLevel,
81
+ rootDir,
82
+ }), { defaultValue: undefined });
83
+ const files = await collectFiles(options.buildDir);
84
+ cb.log?.(`Deploying ${files.length} file(s)`);
85
+ // Incremental deploy: the device-side supervisor only executes paths
86
+ // listed in package.json's `tests` array, so stale files from a prior
87
+ // run are benign (they just sit in flash). Letting the checksum-based
88
+ // KEEP path run makes re-running `mikro test` after a one-file edit
89
+ // upload only the changed file instead of the whole manifest.
90
+ await lastValueFrom(session
91
+ .deploy({
92
+ files,
93
+ envVars: [{ key: 'MIKRO_ENV', value: options.mikroEnv, secret: false }, ...options.envVars],
94
+ restart: true,
95
+ // Each test run needs a fresh runtime so the supervisor re-evaluates
96
+ // the manifest. Without this, a re-run with unchanged files + env
97
+ // short-circuits to abort+no-restart and the device stays in whatever
98
+ // state the previous run left it in.
99
+ alwaysRestart: true,
100
+ })
101
+ .pipe(tap((event) => cb.onDeployEvent?.(event))));
102
+ // Resolve chip before streaming so heap-baseline bookkeeping can run
103
+ // synchronously inside onFileDone — otherwise the per-file render happens
104
+ // before heapBaselineAction is set and the user sees no feedback.
105
+ // ready$ is shareReplay(1) and session.deploy() awaits ready, so this is
106
+ // cached and resolves immediately.
107
+ const ready = await firstValueFrom(session.ready$);
108
+ const chip = ready.chip ?? 'unknown';
109
+ const wrappedCb = {
110
+ ...cb,
111
+ onFileDone: (result, index, total) => {
112
+ applyHeapBaseline(result, chip, options.updateHeapBaselines ?? false);
113
+ cb.onFileDone?.(result, index, total);
114
+ },
115
+ };
116
+ cb.log?.('Waiting for test results...');
117
+ return await collectManifestEvents(session, testFiles, options.timeout, wrappedCb);
118
+ }
119
+ /**
120
+ * Mutates `result` with chip + heap-baseline bookkeeping fields and writes
121
+ * the baseline file when appropriate. Must run before the user-visible
122
+ * render of a TestFileResult so messages like "heap-baseline exceeded" can
123
+ * appear alongside the file's pass/fail summary.
124
+ */
125
+ function applyHeapBaseline(result, chip, update) {
126
+ result.chip = chip;
127
+ if (typeof result.heapDelta !== 'number')
128
+ return;
129
+ const stored = readBaseline(result.file, chip);
130
+ if (update) {
131
+ writeBaseline(result.file, chip, result.heapDelta);
132
+ result.heapBaselineAction = stored === undefined ? 'created' : 'updated';
133
+ result.heapBaselineStored = result.heapDelta;
134
+ return;
135
+ }
136
+ if (stored === undefined) {
137
+ writeBaseline(result.file, chip, result.heapDelta);
138
+ result.heapBaselineAction = 'created';
139
+ result.heapBaselineStored = result.heapDelta;
140
+ return;
141
+ }
142
+ result.heapBaselineStored = stored;
143
+ if (result.heapDelta > stored) {
144
+ result.heapBaselineAction = 'exceeded';
145
+ return;
146
+ }
147
+ // Nudge to tighten the snapshot when actual is well below stored, so
148
+ // optimizations get locked in rather than leaving slack that masks a
149
+ // future regression. Margin: max(512B, 25% of stored).
150
+ const margin = Math.max(512, Math.floor(stored * 0.25));
151
+ result.heapBaselineAction = result.heapDelta < stored - margin ? 'stale' : 'ok';
152
+ }
153
+ function emptyResult(file) {
154
+ return {
155
+ file,
156
+ passed: 0,
157
+ failed: 0,
158
+ skipped: 0,
159
+ todo: 0,
160
+ duration: 0,
161
+ events: [],
162
+ };
163
+ }
164
+ /**
165
+ * Demultiplex the device event stream per file. Each run_done (e:6) closes
166
+ * the current file and advances the index; manifest_done ends the run.
167
+ *
168
+ * Readiness handling: the initial deploy restarts the device once, so a
169
+ * single ready event is expected before test 1. Any subsequent ready event
170
+ * (after test 1's first event) indicates an unexpected reboot — treat as a
171
+ * crash and bail, returning partial results.
172
+ */
173
+ /**
174
+ * Observe the device event stream and produce one TestFileResult per test
175
+ * file. Exported so the reducer's contract with the firmware supervisor
176
+ * can be unit-tested without going through the real build+deploy path.
177
+ */
178
+ export async function collectManifestEvents(session, testFiles, timeoutMs, cb) {
179
+ const debug = process.env.MIKRO_DEBUG_EVENTS === '1';
180
+ /**
181
+ * Match the firmware supervisor's announcement:
182
+ * `[supervisor] running N/M: /app/test/foo.test.js`
183
+ * We read the path as the authoritative file identity. MSG_READY frames
184
+ * can arrive any time the CLI sends CMD_HELLO, so they're not reliable
185
+ * boot signals; the supervisor announce is. */
186
+ const SUPERVISOR_ANNOUNCE_RE = /^\[supervisor\] running \d+\/\d+: (.+?\.(?:js|bjs))$/;
187
+ /** Match a device path like `/app/test/foo.test.js` back to its testFiles
188
+ * index. The device path has a `<rootDir>/` prefix that the CLI's absolute
189
+ * testFiles don't share, so we match by longest-path-suffix first, then
190
+ * fall back to a basename match ONLY if it's unambiguous — two test files
191
+ * sharing a basename must not silently collapse to one index. */
192
+ function matchDevicePathToIndex(devicePath) {
193
+ // Strip one leading path component (the rootDir) from the device path,
194
+ // so `/app/test/foo.test.js` → `test/foo.test.js`.
195
+ const deviceTail = devicePath.replace(/^\/[^/]+\//, '');
196
+ for (let i = 0; i < testFiles.length; i++) {
197
+ const cliPath = testFiles[i].replace(/\.ts$/, '.js');
198
+ if (devicePath.endsWith(cliPath) || cliPath.endsWith(deviceTail))
199
+ return i;
200
+ }
201
+ // Basename-only fallback — only if exactly one testFile matches, so we
202
+ // never mis-attribute events between e.g. unit/foo.test.ts and
203
+ // integration/foo.test.ts.
204
+ const deviceBase = devicePath.split('/').pop();
205
+ let basenameMatch = -1;
206
+ for (let i = 0; i < testFiles.length; i++) {
207
+ const cliBase = testFiles[i].replace(/\.ts$/, '.js').split('/').pop();
208
+ if (cliBase === deviceBase) {
209
+ if (basenameMatch >= 0)
210
+ return -1;
211
+ basenameMatch = i;
212
+ }
213
+ }
214
+ return basenameMatch;
215
+ }
216
+ const initialState = {
217
+ index: 0,
218
+ seenAnyTestForIndex: false,
219
+ results: testFiles.map(emptyResult),
220
+ done: false,
221
+ doneReason: null,
222
+ /* No initial onFileStart here — we let the firmware supervisor's
223
+ * `[supervisor] running N/M: /app/path` announcement drive it. This
224
+ * keeps a single side-effect path and makes announcements the single
225
+ * source of truth for file identity, which matters when the device
226
+ * crash-reboots and re-runs files out of ordinal sequence. */
227
+ emits: [],
228
+ };
229
+ // Sentinel event injected by the timeout operator so the reducer can
230
+ // close out the current index with a timeout error using the same code
231
+ // path as other terminal transitions.
232
+ const TIMEOUT_EVENT = { type: '__timeout' };
233
+ function reduce(prev, event) {
234
+ if (prev.done)
235
+ return { ...prev, emits: [] };
236
+ const currentFile = testFiles[prev.index];
237
+ if (!currentFile)
238
+ return { ...prev, done: true, doneReason: 'manifest_done', emits: [] };
239
+ if (event.type === '__timeout') {
240
+ const results = prev.results.slice();
241
+ if (prev.index < testFiles.length && !results[prev.index]?.error) {
242
+ results[prev.index] = {
243
+ ...results[prev.index],
244
+ error: `Timeout after ${timeoutMs}ms`,
245
+ };
246
+ }
247
+ return { ...prev, results, done: true, doneReason: 'timeout', emits: [] };
248
+ }
249
+ switch (event.type) {
250
+ case 'ready':
251
+ /* Ignore ready events outright. They can arrive whenever the CLI
252
+ * sends CMD_HELLO (e.g. during awaitReady$ inside a deploy), so
253
+ * they're not reliable boot signals. Real crash detection comes
254
+ * from seeing an earlier supervisor-announce path than the current
255
+ * index (see below). */
256
+ return { ...prev, emits: [] };
257
+ case 'manifest_done':
258
+ return { ...prev, done: true, doneReason: 'manifest_done', emits: [] };
259
+ case 'disconnect':
260
+ return { ...prev, done: true, doneReason: 'disconnect', emits: [] };
261
+ case 'debug': {
262
+ /* Supervisor announcements are the authoritative signal for which
263
+ * file the device is about to evaluate. Use them to sync the
264
+ * CLI's index to whatever the device is actually running — this
265
+ * handles out-of-order execution, skipped files, and (critically)
266
+ * crash-reboot loops where the device restarts mid-manifest and
267
+ * re-runs files from 1. */
268
+ const match = SUPERVISOR_ANNOUNCE_RE.exec(event.text);
269
+ if (match) {
270
+ const devicePath = match[1];
271
+ const targetIndex = matchDevicePathToIndex(devicePath);
272
+ if (targetIndex >= 0) {
273
+ if (targetIndex < prev.index && prev.seenAnyTestForIndex) {
274
+ /* Device jumped back — it crashed and restarted. Bail with
275
+ * what we have; the partial results of the current file are
276
+ * meaningless now, and re-running earlier files would
277
+ * overwrite already-closed results. */
278
+ const results = prev.results.slice();
279
+ if (!results[prev.index]?.error) {
280
+ results[prev.index] = {
281
+ ...results[prev.index],
282
+ error: 'Device restarted unexpectedly during test run',
283
+ };
284
+ }
285
+ return {
286
+ ...prev,
287
+ results,
288
+ done: true,
289
+ doneReason: 'crash',
290
+ emits: [{ kind: 'log', level: 'error', text: event.text, file: currentFile }],
291
+ };
292
+ }
293
+ if (targetIndex !== prev.index) {
294
+ /* Forward jump: the supervisor skipped over some files (or
295
+ * we missed their e:6 events). Start the new file. */
296
+ return {
297
+ ...prev,
298
+ index: targetIndex,
299
+ seenAnyTestForIndex: false,
300
+ emits: [
301
+ {
302
+ kind: 'log',
303
+ level: 'debug',
304
+ text: event.text,
305
+ file: testFiles[targetIndex],
306
+ },
307
+ { kind: 'file_start', file: testFiles[targetIndex], index: targetIndex },
308
+ ],
309
+ };
310
+ }
311
+ /* Same index. If we haven't seen any test events for it yet,
312
+ * this is the expected "announce for the file e:6 just advanced
313
+ * us to" — fire onFileStart now. Otherwise a re-announce (e.g.
314
+ * device re-running the same file for some reason) is just a
315
+ * log line. */
316
+ if (!prev.seenAnyTestForIndex) {
317
+ return {
318
+ ...prev,
319
+ emits: [
320
+ { kind: 'log', level: 'debug', text: event.text, file: currentFile },
321
+ { kind: 'file_start', file: currentFile, index: prev.index },
322
+ ],
323
+ };
324
+ }
325
+ }
326
+ }
327
+ return {
328
+ ...prev,
329
+ emits: [{ kind: 'log', level: 'debug', text: event.text, file: currentFile }],
330
+ };
331
+ }
332
+ case 'log':
333
+ case 'warn':
334
+ case 'error':
335
+ case 'info':
336
+ return {
337
+ ...prev,
338
+ emits: [{ kind: 'log', level: event.type, text: event.text, file: currentFile }],
339
+ };
340
+ case 'raw':
341
+ /* Raw bytes are non-TLV output from the device (boot banner, panic
342
+ * traces). They aren't attributable to a specific test file, so the
343
+ * test command's top-level session.messages$ subscription forwards
344
+ * them directly. Silently pass through here. */
345
+ return { ...prev, emits: [] };
346
+ case 'eval_error': {
347
+ const results = prev.results.slice();
348
+ results[prev.index] = {
349
+ ...results[prev.index],
350
+ error: `Fatal error: ${event.text}`,
351
+ };
352
+ return {
353
+ ...prev,
354
+ results,
355
+ emits: [{ kind: 'log', level: 'error', text: event.text, file: currentFile }],
356
+ };
357
+ }
358
+ case 'test':
359
+ return reduceTestEvent(prev, event, currentFile);
360
+ default:
361
+ return { ...prev, emits: [] };
362
+ }
363
+ }
364
+ function reduceTestEvent(prev, event, currentFile) {
365
+ const d = event.data;
366
+ const e = d.e;
367
+ const results = prev.results.slice();
368
+ const result = {
369
+ ...results[prev.index],
370
+ events: [...results[prev.index].events, event],
371
+ };
372
+ if (e === 2)
373
+ result.passed++;
374
+ else if (e === 3)
375
+ result.failed++;
376
+ else if (e === 4)
377
+ result.skipped++;
378
+ else if (e === 9)
379
+ result.todo++;
380
+ const emits = [{ kind: 'event', event, file: currentFile }];
381
+ if (e === 6) {
382
+ result.passed = d.p ?? result.passed;
383
+ result.failed = d.f ?? result.failed;
384
+ result.skipped = d.k ?? result.skipped;
385
+ result.todo = d.o ?? result.todo;
386
+ result.duration = d.d ?? 0;
387
+ if (typeof d.hb === 'number' && typeof d.ha === 'number') {
388
+ result.heapDelta = d.ha - d.hb;
389
+ }
390
+ if (typeof d.tb === 'number' && typeof d.ta === 'number') {
391
+ result.timerDelta = d.ta - d.tb;
392
+ }
393
+ if (typeof d.pb === 'number' && typeof d.pa === 'number') {
394
+ result.pendingDelta = d.pa - d.pb;
395
+ }
396
+ emits.push({ kind: 'file_done', result, index: prev.index, file: currentFile });
397
+ const nextIndex = prev.index + 1;
398
+ results[prev.index] = result;
399
+ if (nextIndex < testFiles.length) {
400
+ /* Don't preemptively fire onFileStart here — the next supervisor
401
+ * announcement will drive that. If the device crashes and
402
+ * restarts, the expected "next" file is wrong anyway. */
403
+ return { ...prev, results, index: nextIndex, seenAnyTestForIndex: false, emits };
404
+ }
405
+ // Ran out of declared files — natural end of manifest.
406
+ return {
407
+ ...prev,
408
+ results,
409
+ index: nextIndex,
410
+ seenAnyTestForIndex: false,
411
+ done: true,
412
+ doneReason: 'manifest_done',
413
+ emits,
414
+ };
415
+ }
416
+ results[prev.index] = result;
417
+ return { ...prev, results, seenAnyTestForIndex: true, emits };
418
+ }
419
+ function applyEmits(state) {
420
+ for (const e of state.emits) {
421
+ if (e.kind === 'file_start')
422
+ cb.onFileStart?.(e.file, e.index, testFiles.length);
423
+ else if (e.kind === 'file_done')
424
+ cb.onFileDone?.(e.result, e.index, testFiles.length);
425
+ else if (e.kind === 'event')
426
+ cb.onEvent?.(e.event, e.file);
427
+ else if (e.kind === 'log')
428
+ cb.onLog?.(e.level, e.text, e.file);
429
+ }
430
+ }
431
+ const final = await lastValueFrom(session.messages$.pipe(
432
+ // Raw-event diagnostic: logs every event before any filtering, so
433
+ // we can tell whether session.messages$ is emitting at all or the
434
+ // issue is further up the pipeline. No-op unless MIKRO_DEBUG_EVENTS=1.
435
+ tap((event) => {
436
+ if (debug) {
437
+ // eslint-disable-next-line no-console
438
+ console.error(`[raw-ev] ${event.type}`);
439
+ }
440
+ }),
441
+ // Per-emission timeout: if no event arrives for `timeoutMs`, inject
442
+ // a synthetic timeout event so the reducer can close out the current
443
+ // index with a real error message. Good-enough proxy for per-file:
444
+ // test.ts emits heap events around each test, so an actively-running
445
+ // file keeps ticking this timer; a hung/crashed device stops
446
+ // emitting and trips it.
447
+ timeout({ each: timeoutMs, with: () => of(TIMEOUT_EVENT) }), scan(reduce, initialState), tap((state) => {
448
+ if (debug) {
449
+ // eslint-disable-next-line no-console
450
+ console.error(`[dbg] idx=${state.index} done=${state.done}${state.doneReason ? `(${state.doneReason})` : ''} emits=${state.emits.length}`);
451
+ }
452
+ applyEmits(state);
453
+ }), takeWhile((state) => !state.done, true), last(), catchError((err) => {
454
+ // Any unexpected stream error ends the run with a diagnostic on
455
+ // file 0 rather than a silent reject.
456
+ const results = testFiles.map(emptyResult);
457
+ results[0].error = `Unexpected stream error: ${String(err)}`;
458
+ return of({
459
+ index: 0,
460
+ seenAnyTestForIndex: false,
461
+ results,
462
+ done: true,
463
+ doneReason: null,
464
+ emits: [],
465
+ });
466
+ })));
467
+ return final.results;
468
+ }
469
+ //# sourceMappingURL=testRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testRunner.js","sourceRoot":"","sources":["../../../src/cli/lib/testRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Transport abstraction for the MIK protocol.
3
+ *
4
+ * A transport is a bidirectional byte pipe. The protocol layer (session.ts)
5
+ * builds on top of it. `createSerialTransport` wraps a `serialport` SerialPort
6
+ * instance; other implementations (loopback, WebSocket) can be added for
7
+ * testing or alternative connectivity.
8
+ */
9
+ import { Observable } from 'rxjs';
10
+ import { SerialPort } from 'serialport';
11
+ export interface Transport {
12
+ /** Push data to the device. Returns a promise that resolves once the
13
+ * bytes have been flushed to the OS — important for tiny writes
14
+ * (e.g. 5-byte command frames) on macOS, where node-serialport's
15
+ * internal queue can otherwise hold them indefinitely behind a
16
+ * USB-CDC packet boundary. */
17
+ write(data: Uint8Array): Promise<void>;
18
+ /** Observable stream of incoming bytes from the device */
19
+ data: Observable<Uint8Array>;
20
+ /** Tear down the transport */
21
+ close(): void;
22
+ }
23
+ /**
24
+ * Open a serial port as an Observable. Emits the open port, then completes.
25
+ * Closing the port on unsubscribe ensures cleanup if the subscriber cancels.
26
+ */
27
+ export declare function openSerial(path: string, baudRate: number): Observable<SerialPort>;
28
+ /**
29
+ * Create a transport backed by a SerialPort instance.
30
+ * The caller owns the SerialPort lifecycle; `close()` removes listeners
31
+ * but does NOT close the port (the caller may reuse it).
32
+ */
33
+ export declare function createSerialTransport(serialPort: SerialPort): Transport;
34
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAC,UAAU,EAAC,MAAM,MAAM,CAAA;AAC/B,OAAO,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAErC,MAAM,WAAW,SAAS;IACxB;;;;mCAI+B;IAC/B,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,0DAA0D;IAC1D,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,CAAA;IAC5B,8BAA8B;IAC9B,KAAK,IAAI,IAAI,CAAA;CACd;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAmBjF;AAKD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAgFvE"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Transport abstraction for the MIK protocol.
3
+ *
4
+ * A transport is a bidirectional byte pipe. The protocol layer (session.ts)
5
+ * builds on top of it. `createSerialTransport` wraps a `serialport` SerialPort
6
+ * instance; other implementations (loopback, WebSocket) can be added for
7
+ * testing or alternative connectivity.
8
+ */
9
+ import { Observable } from 'rxjs';
10
+ import { SerialPort } from 'serialport';
11
+ /**
12
+ * Open a serial port as an Observable. Emits the open port, then completes.
13
+ * Closing the port on unsubscribe ensures cleanup if the subscriber cancels.
14
+ */
15
+ export function openSerial(path, baudRate) {
16
+ return new Observable((observer) => {
17
+ let opened = false;
18
+ const serial = new SerialPort({ path, baudRate, autoOpen: false });
19
+ serial.open((err) => {
20
+ if (err) {
21
+ observer.error(err);
22
+ }
23
+ else {
24
+ opened = true;
25
+ observer.next(serial);
26
+ observer.complete();
27
+ }
28
+ });
29
+ return () => {
30
+ // Only close if the open was cancelled before completing.
31
+ // Once emitted, the consumer owns the serial port lifecycle.
32
+ if (!opened && serial.isOpen)
33
+ serial.close();
34
+ };
35
+ });
36
+ }
37
+ /** Chunk size for serial writes (avoids overflowing device UART FIFO) */
38
+ const WRITE_CHUNK_SIZE = 64;
39
+ /**
40
+ * Create a transport backed by a SerialPort instance.
41
+ * The caller owns the SerialPort lifecycle; `close()` removes listeners
42
+ * but does NOT close the port (the caller may reuse it).
43
+ */
44
+ export function createSerialTransport(serialPort) {
45
+ const debugBytes = process.env.MIKRO_DEBUG_SERIAL === '1';
46
+ const data = new Observable((observer) => {
47
+ const onData = (chunk) => {
48
+ if (debugBytes) {
49
+ // eslint-disable-next-line no-console
50
+ console.error(`[serial rx ${chunk.length}B] ${chunk.subarray(0, Math.min(chunk.length, 64)).toString('hex')}${chunk.length > 64 ? '...' : ''}`);
51
+ }
52
+ observer.next(new Uint8Array(chunk));
53
+ };
54
+ const onError = (err) => {
55
+ if (debugBytes) {
56
+ // eslint-disable-next-line no-console
57
+ console.error(`[serial error] ${String(err)}`);
58
+ }
59
+ observer.error(err);
60
+ };
61
+ const onClose = () => {
62
+ if (debugBytes) {
63
+ // eslint-disable-next-line no-console
64
+ console.error('[serial close]');
65
+ }
66
+ observer.complete();
67
+ };
68
+ serialPort.on('data', onData);
69
+ serialPort.on('error', onError);
70
+ serialPort.on('close', onClose);
71
+ return () => {
72
+ serialPort.off('data', onData);
73
+ serialPort.off('error', onError);
74
+ serialPort.off('close', onClose);
75
+ };
76
+ });
77
+ return {
78
+ write(chunk) {
79
+ if (debugBytes) {
80
+ // eslint-disable-next-line no-console
81
+ console.error(`[serial tx ${chunk.length}B] ${Buffer.from(chunk.subarray(0, Math.min(chunk.length, 64))).toString('hex')}${chunk.length > 64 ? '...' : ''}`);
82
+ }
83
+ // Write in small chunks with drain to avoid overflowing the device FIFO.
84
+ // serialport's write() queues internally, so sequential calls are safe.
85
+ for (let offset = 0; offset < chunk.length; offset += WRITE_CHUNK_SIZE) {
86
+ const slice = chunk.subarray(offset, offset + WRITE_CHUNK_SIZE);
87
+ serialPort.write(Buffer.from(slice));
88
+ }
89
+ return new Promise((resolve, reject) => {
90
+ serialPort.drain((err) => {
91
+ if (err) {
92
+ if (debugBytes) {
93
+ // eslint-disable-next-line no-console
94
+ console.error(`[serial tx drain error] ${String(err)}`);
95
+ }
96
+ reject(err);
97
+ }
98
+ else {
99
+ if (debugBytes) {
100
+ // eslint-disable-next-line no-console
101
+ console.error(`[serial tx drained ${chunk.length}B]`);
102
+ }
103
+ resolve();
104
+ }
105
+ });
106
+ });
107
+ },
108
+ data,
109
+ close() {
110
+ // Remove all our listeners but don't close the port
111
+ serialPort.removeAllListeners('data');
112
+ serialPort.removeAllListeners('error');
113
+ serialPort.removeAllListeners('close');
114
+ },
115
+ };
116
+ }
117
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/cli/lib/transport.ts"],"names":[],"mappings":"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"}