movehat 0.1.8 → 0.2.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 (445) hide show
  1. package/README.md +2 -2
  2. package/dist/__tests__/deployContract.test.d.ts +2 -0
  3. package/dist/__tests__/deployContract.test.d.ts.map +1 -0
  4. package/dist/__tests__/deployContract.test.js +368 -0
  5. package/dist/__tests__/deployContract.test.js.map +1 -0
  6. package/dist/__tests__/errors.test.d.ts +2 -0
  7. package/dist/__tests__/errors.test.d.ts.map +1 -0
  8. package/dist/__tests__/errors.test.js +46 -0
  9. package/dist/__tests__/errors.test.js.map +1 -0
  10. package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +24 -0
  11. package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/sigint-deploy-harness.js +82 -0
  13. package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +1 -0
  14. package/dist/__tests__/fork/api.test.d.ts +2 -0
  15. package/dist/__tests__/fork/api.test.d.ts.map +1 -0
  16. package/dist/__tests__/fork/api.test.js +110 -0
  17. package/dist/__tests__/fork/api.test.js.map +1 -0
  18. package/dist/__tests__/harness/Harness.createLive.test.d.ts +2 -0
  19. package/dist/__tests__/harness/Harness.createLive.test.d.ts.map +1 -0
  20. package/dist/__tests__/harness/Harness.createLive.test.js +53 -0
  21. package/dist/__tests__/harness/Harness.createLive.test.js.map +1 -0
  22. package/dist/__tests__/harness/Harness.proxy.test.d.ts +2 -0
  23. package/dist/__tests__/harness/Harness.proxy.test.d.ts.map +1 -0
  24. package/dist/__tests__/harness/Harness.proxy.test.js +93 -0
  25. package/dist/__tests__/harness/Harness.proxy.test.js.map +1 -0
  26. package/dist/__tests__/harness/_fixture.d.ts +54 -0
  27. package/dist/__tests__/harness/_fixture.d.ts.map +1 -0
  28. package/dist/__tests__/harness/_fixture.js +69 -0
  29. package/dist/__tests__/harness/_fixture.js.map +1 -0
  30. package/dist/__tests__/harness/codeObject.deploy.test.d.ts +2 -0
  31. package/dist/__tests__/harness/codeObject.deploy.test.d.ts.map +1 -0
  32. package/dist/__tests__/harness/codeObject.deploy.test.js +288 -0
  33. package/dist/__tests__/harness/codeObject.deploy.test.js.map +1 -0
  34. package/dist/__tests__/harness/codeObject.upgrade.test.d.ts +2 -0
  35. package/dist/__tests__/harness/codeObject.upgrade.test.d.ts.map +1 -0
  36. package/dist/__tests__/harness/codeObject.upgrade.test.js +138 -0
  37. package/dist/__tests__/harness/codeObject.upgrade.test.js.map +1 -0
  38. package/dist/__tests__/harness/script.test.d.ts +2 -0
  39. package/dist/__tests__/harness/script.test.d.ts.map +1 -0
  40. package/dist/__tests__/harness/script.test.js +219 -0
  41. package/dist/__tests__/harness/script.test.js.map +1 -0
  42. package/dist/__tests__/harness/view.test.d.ts +2 -0
  43. package/dist/__tests__/harness/view.test.d.ts.map +1 -0
  44. package/dist/__tests__/harness/view.test.js +92 -0
  45. package/dist/__tests__/harness/view.test.js.map +1 -0
  46. package/dist/__tests__/runtime.test.d.ts +2 -0
  47. package/dist/__tests__/runtime.test.d.ts.map +1 -0
  48. package/dist/__tests__/runtime.test.js +141 -0
  49. package/dist/__tests__/runtime.test.js.map +1 -0
  50. package/dist/cli.js +2 -1
  51. package/dist/cli.js.map +1 -1
  52. package/dist/commands/__tests__/compile.test.d.ts +2 -0
  53. package/dist/commands/__tests__/compile.test.d.ts.map +1 -0
  54. package/dist/commands/__tests__/compile.test.js +351 -0
  55. package/dist/commands/__tests__/compile.test.js.map +1 -0
  56. package/dist/commands/__tests__/init.test.d.ts +2 -0
  57. package/dist/commands/__tests__/init.test.d.ts.map +1 -0
  58. package/dist/commands/__tests__/init.test.js +101 -0
  59. package/dist/commands/__tests__/init.test.js.map +1 -0
  60. package/dist/commands/__tests__/run.test.d.ts +2 -0
  61. package/dist/commands/__tests__/run.test.d.ts.map +1 -0
  62. package/dist/commands/__tests__/run.test.js +166 -0
  63. package/dist/commands/__tests__/run.test.js.map +1 -0
  64. package/dist/commands/__tests__/test-move.test.d.ts +2 -0
  65. package/dist/commands/__tests__/test-move.test.d.ts.map +1 -0
  66. package/dist/commands/__tests__/test-move.test.js +59 -0
  67. package/dist/commands/__tests__/test-move.test.js.map +1 -0
  68. package/dist/commands/__tests__/test.test.d.ts +2 -0
  69. package/dist/commands/__tests__/test.test.d.ts.map +1 -0
  70. package/dist/commands/__tests__/test.test.js +168 -0
  71. package/dist/commands/__tests__/test.test.js.map +1 -0
  72. package/dist/commands/__tests__/update.test.d.ts +2 -0
  73. package/dist/commands/__tests__/update.test.d.ts.map +1 -0
  74. package/dist/commands/__tests__/update.test.js +176 -0
  75. package/dist/commands/__tests__/update.test.js.map +1 -0
  76. package/dist/commands/compile.d.ts +7 -1
  77. package/dist/commands/compile.d.ts.map +1 -1
  78. package/dist/commands/compile.js +150 -33
  79. package/dist/commands/compile.js.map +1 -1
  80. package/dist/commands/fork/__tests__/create.test.d.ts +2 -0
  81. package/dist/commands/fork/__tests__/create.test.d.ts.map +1 -0
  82. package/dist/commands/fork/__tests__/create.test.js +108 -0
  83. package/dist/commands/fork/__tests__/create.test.js.map +1 -0
  84. package/dist/commands/fork/__tests__/fund.test.d.ts +2 -0
  85. package/dist/commands/fork/__tests__/fund.test.d.ts.map +1 -0
  86. package/dist/commands/fork/__tests__/fund.test.js +72 -0
  87. package/dist/commands/fork/__tests__/fund.test.js.map +1 -0
  88. package/dist/commands/fork/__tests__/list.test.d.ts +2 -0
  89. package/dist/commands/fork/__tests__/list.test.d.ts.map +1 -0
  90. package/dist/commands/fork/__tests__/list.test.js +119 -0
  91. package/dist/commands/fork/__tests__/list.test.js.map +1 -0
  92. package/dist/commands/fork/__tests__/serve.test.d.ts +2 -0
  93. package/dist/commands/fork/__tests__/serve.test.d.ts.map +1 -0
  94. package/dist/commands/fork/__tests__/serve.test.js +97 -0
  95. package/dist/commands/fork/__tests__/serve.test.js.map +1 -0
  96. package/dist/commands/fork/__tests__/view-resource.test.d.ts +2 -0
  97. package/dist/commands/fork/__tests__/view-resource.test.d.ts.map +1 -0
  98. package/dist/commands/fork/__tests__/view-resource.test.js +77 -0
  99. package/dist/commands/fork/__tests__/view-resource.test.js.map +1 -0
  100. package/dist/commands/fork/create.d.ts +1 -1
  101. package/dist/commands/fork/create.d.ts.map +1 -1
  102. package/dist/commands/fork/create.js +3 -2
  103. package/dist/commands/fork/create.js.map +1 -1
  104. package/dist/commands/fork/fund.d.ts.map +1 -1
  105. package/dist/commands/fork/fund.js +15 -8
  106. package/dist/commands/fork/fund.js.map +1 -1
  107. package/dist/commands/fork/list.d.ts.map +1 -1
  108. package/dist/commands/fork/list.js +2 -1
  109. package/dist/commands/fork/list.js.map +1 -1
  110. package/dist/commands/fork/serve.d.ts +1 -0
  111. package/dist/commands/fork/serve.d.ts.map +1 -1
  112. package/dist/commands/fork/serve.js +4 -2
  113. package/dist/commands/fork/serve.js.map +1 -1
  114. package/dist/commands/fork/view-resource.d.ts.map +1 -1
  115. package/dist/commands/fork/view-resource.js +10 -5
  116. package/dist/commands/fork/view-resource.js.map +1 -1
  117. package/dist/commands/run.d.ts +15 -0
  118. package/dist/commands/run.d.ts.map +1 -1
  119. package/dist/commands/run.js +50 -27
  120. package/dist/commands/run.js.map +1 -1
  121. package/dist/commands/test-move.d.ts.map +1 -1
  122. package/dist/commands/test-move.js +3 -2
  123. package/dist/commands/test-move.js.map +1 -1
  124. package/dist/commands/test.js +52 -46
  125. package/dist/commands/test.js.map +1 -1
  126. package/dist/commands/update.d.ts.map +1 -1
  127. package/dist/commands/update.js +15 -13
  128. package/dist/commands/update.js.map +1 -1
  129. package/dist/core/AccountManager.d.ts +1 -1
  130. package/dist/core/AccountManager.d.ts.map +1 -1
  131. package/dist/core/AccountManager.js +20 -7
  132. package/dist/core/AccountManager.js.map +1 -1
  133. package/dist/core/Publisher.d.ts +31 -0
  134. package/dist/core/Publisher.d.ts.map +1 -0
  135. package/dist/core/Publisher.js +248 -0
  136. package/dist/core/Publisher.js.map +1 -0
  137. package/dist/core/__tests__/AccountManager.test.d.ts +2 -0
  138. package/dist/core/__tests__/AccountManager.test.d.ts.map +1 -0
  139. package/dist/core/__tests__/AccountManager.test.js +239 -0
  140. package/dist/core/__tests__/AccountManager.test.js.map +1 -0
  141. package/dist/core/__tests__/config.test.d.ts +2 -0
  142. package/dist/core/__tests__/config.test.d.ts.map +1 -0
  143. package/dist/core/__tests__/config.test.js +311 -0
  144. package/dist/core/__tests__/config.test.js.map +1 -0
  145. package/dist/core/__tests__/deployments.test.d.ts +2 -0
  146. package/dist/core/__tests__/deployments.test.d.ts.map +1 -0
  147. package/dist/core/__tests__/deployments.test.js +201 -0
  148. package/dist/core/__tests__/deployments.test.js.map +1 -0
  149. package/dist/core/__tests__/shell.test.d.ts +2 -0
  150. package/dist/core/__tests__/shell.test.d.ts.map +1 -0
  151. package/dist/core/__tests__/shell.test.js +107 -0
  152. package/dist/core/__tests__/shell.test.js.map +1 -0
  153. package/dist/core/config.d.ts +13 -1
  154. package/dist/core/config.d.ts.map +1 -1
  155. package/dist/core/config.js +80 -11
  156. package/dist/core/config.js.map +1 -1
  157. package/dist/core/contract.d.ts +1 -1
  158. package/dist/core/contract.d.ts.map +1 -1
  159. package/dist/core/contract.js +15 -4
  160. package/dist/core/contract.js.map +1 -1
  161. package/dist/core/deployments.d.ts +2 -2
  162. package/dist/core/deployments.d.ts.map +1 -1
  163. package/dist/core/deployments.js +8 -6
  164. package/dist/core/deployments.js.map +1 -1
  165. package/dist/core/movementProfile.d.ts +34 -0
  166. package/dist/core/movementProfile.d.ts.map +1 -0
  167. package/dist/core/movementProfile.js +150 -0
  168. package/dist/core/movementProfile.js.map +1 -0
  169. package/dist/core/shell.d.ts +23 -7
  170. package/dist/core/shell.d.ts.map +1 -1
  171. package/dist/core/shell.js +32 -14
  172. package/dist/core/shell.js.map +1 -1
  173. package/dist/errors.d.ts +35 -0
  174. package/dist/errors.d.ts.map +1 -1
  175. package/dist/errors.js +54 -0
  176. package/dist/errors.js.map +1 -1
  177. package/dist/fork/__tests__/manager.test.d.ts +2 -0
  178. package/dist/fork/__tests__/manager.test.d.ts.map +1 -0
  179. package/dist/fork/__tests__/manager.test.js +309 -0
  180. package/dist/fork/__tests__/manager.test.js.map +1 -0
  181. package/dist/fork/__tests__/server.test.d.ts +2 -0
  182. package/dist/fork/__tests__/server.test.d.ts.map +1 -0
  183. package/dist/fork/__tests__/server.test.js +54 -0
  184. package/dist/fork/__tests__/server.test.js.map +1 -0
  185. package/dist/fork/__tests__/storage.test.d.ts +2 -0
  186. package/dist/fork/__tests__/storage.test.d.ts.map +1 -0
  187. package/dist/fork/__tests__/storage.test.js +222 -0
  188. package/dist/fork/__tests__/storage.test.js.map +1 -0
  189. package/dist/fork/__tests__/test.test.d.ts +2 -0
  190. package/dist/fork/__tests__/test.test.d.ts.map +1 -0
  191. package/dist/fork/__tests__/test.test.js +81 -0
  192. package/dist/fork/__tests__/test.test.js.map +1 -0
  193. package/dist/fork/api.d.ts +14 -3
  194. package/dist/fork/api.d.ts.map +1 -1
  195. package/dist/fork/api.js +25 -14
  196. package/dist/fork/api.js.map +1 -1
  197. package/dist/fork/manager.d.ts +23 -9
  198. package/dist/fork/manager.d.ts.map +1 -1
  199. package/dist/fork/manager.js +79 -36
  200. package/dist/fork/manager.js.map +1 -1
  201. package/dist/fork/server.d.ts +11 -3
  202. package/dist/fork/server.d.ts.map +1 -1
  203. package/dist/fork/server.js +45 -13
  204. package/dist/fork/server.js.map +1 -1
  205. package/dist/fork/storage.d.ts +4 -4
  206. package/dist/fork/storage.d.ts.map +1 -1
  207. package/dist/fork/storage.js +7 -9
  208. package/dist/fork/storage.js.map +1 -1
  209. package/dist/fork/test.d.ts +13 -4
  210. package/dist/fork/test.d.ts.map +1 -1
  211. package/dist/fork/test.js +36 -27
  212. package/dist/fork/test.js.map +1 -1
  213. package/dist/harness/Harness.d.ts +124 -0
  214. package/dist/harness/Harness.d.ts.map +1 -0
  215. package/dist/harness/Harness.js +193 -0
  216. package/dist/harness/Harness.js.map +1 -0
  217. package/dist/harness/codeObject.d.ts +31 -0
  218. package/dist/harness/codeObject.d.ts.map +1 -0
  219. package/dist/harness/codeObject.js +271 -0
  220. package/dist/harness/codeObject.js.map +1 -0
  221. package/dist/harness/errors.d.ts +14 -0
  222. package/dist/harness/errors.d.ts.map +1 -0
  223. package/dist/harness/errors.js +22 -0
  224. package/dist/harness/errors.js.map +1 -0
  225. package/dist/harness/index.d.ts +4 -0
  226. package/dist/harness/index.d.ts.map +1 -0
  227. package/dist/harness/index.js +3 -0
  228. package/dist/harness/index.js.map +1 -0
  229. package/dist/harness/proxy.d.ts +7 -0
  230. package/dist/harness/proxy.d.ts.map +1 -0
  231. package/dist/harness/proxy.js +36 -0
  232. package/dist/harness/proxy.js.map +1 -0
  233. package/dist/harness/script.d.ts +21 -0
  234. package/dist/harness/script.d.ts.map +1 -0
  235. package/dist/harness/script.js +155 -0
  236. package/dist/harness/script.js.map +1 -0
  237. package/dist/harness/view.d.ts +22 -0
  238. package/dist/harness/view.d.ts.map +1 -0
  239. package/dist/harness/view.js +28 -0
  240. package/dist/harness/view.js.map +1 -0
  241. package/dist/helpers/__tests__/semver-utils.test.d.ts +2 -0
  242. package/dist/helpers/__tests__/semver-utils.test.d.ts.map +1 -0
  243. package/dist/helpers/__tests__/semver-utils.test.js +103 -0
  244. package/dist/helpers/__tests__/semver-utils.test.js.map +1 -0
  245. package/dist/helpers/index.d.ts +3 -2
  246. package/dist/helpers/index.d.ts.map +1 -1
  247. package/dist/helpers/index.js +2 -2
  248. package/dist/helpers/index.js.map +1 -1
  249. package/dist/helpers/move-tests.d.ts +3 -3
  250. package/dist/helpers/move-tests.d.ts.map +1 -1
  251. package/dist/helpers/move-tests.js +21 -20
  252. package/dist/helpers/move-tests.js.map +1 -1
  253. package/dist/helpers/npm-registry.d.ts.map +1 -1
  254. package/dist/helpers/npm-registry.js +1 -3
  255. package/dist/helpers/npm-registry.js.map +1 -1
  256. package/dist/helpers/semver-utils.d.ts.map +1 -1
  257. package/dist/helpers/semver-utils.js +4 -3
  258. package/dist/helpers/semver-utils.js.map +1 -1
  259. package/dist/helpers/setup.d.ts.map +1 -1
  260. package/dist/helpers/setup.js +10 -6
  261. package/dist/helpers/setup.js.map +1 -1
  262. package/dist/helpers/setupLocalTesting.d.ts +32 -27
  263. package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
  264. package/dist/helpers/setupLocalTesting.js +179 -180
  265. package/dist/helpers/setupLocalTesting.js.map +1 -1
  266. package/dist/helpers/testFixtures.d.ts +19 -53
  267. package/dist/helpers/testFixtures.d.ts.map +1 -1
  268. package/dist/helpers/testFixtures.js +89 -107
  269. package/dist/helpers/testFixtures.js.map +1 -1
  270. package/dist/index.d.ts +4 -2
  271. package/dist/index.d.ts.map +1 -1
  272. package/dist/index.js +7 -3
  273. package/dist/index.js.map +1 -1
  274. package/dist/node/LocalNodeManager.d.ts +9 -1
  275. package/dist/node/LocalNodeManager.d.ts.map +1 -1
  276. package/dist/node/LocalNodeManager.js +75 -58
  277. package/dist/node/LocalNodeManager.js.map +1 -1
  278. package/dist/node/__tests__/LocalNodeManager.test.d.ts +2 -0
  279. package/dist/node/__tests__/LocalNodeManager.test.d.ts.map +1 -0
  280. package/dist/node/__tests__/LocalNodeManager.test.js +349 -0
  281. package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -0
  282. package/dist/runtime.d.ts +12 -15
  283. package/dist/runtime.d.ts.map +1 -1
  284. package/dist/runtime.js +32 -241
  285. package/dist/runtime.js.map +1 -1
  286. package/dist/templates/README.md +1 -1
  287. package/dist/templates/movehat.config.ts +10 -0
  288. package/dist/templates/package.json +2 -1
  289. package/dist/templates/scripts/deploy-counter.ts +46 -38
  290. package/dist/templates/tests/Counter.test.ts +51 -51
  291. package/dist/templates/types/movehat.d.ts +6 -9
  292. package/dist/types/config.d.ts +8 -0
  293. package/dist/types/config.d.ts.map +1 -1
  294. package/dist/types/fork.d.ts +7 -1
  295. package/dist/types/fork.d.ts.map +1 -1
  296. package/dist/types/harness.d.ts +166 -0
  297. package/dist/types/harness.d.ts.map +1 -0
  298. package/dist/types/harness.js +2 -0
  299. package/dist/types/harness.js.map +1 -0
  300. package/dist/types/runtime.d.ts +7 -1
  301. package/dist/types/runtime.d.ts.map +1 -1
  302. package/dist/ui/__tests__/colors.test.d.ts +2 -0
  303. package/dist/ui/__tests__/colors.test.d.ts.map +1 -0
  304. package/dist/ui/__tests__/colors.test.js +127 -0
  305. package/dist/ui/__tests__/colors.test.js.map +1 -0
  306. package/dist/ui/colors.d.ts.map +1 -1
  307. package/dist/ui/colors.js +6 -2
  308. package/dist/ui/colors.js.map +1 -1
  309. package/dist/ui/logger.d.ts +17 -0
  310. package/dist/ui/logger.d.ts.map +1 -1
  311. package/dist/ui/logger.js +22 -0
  312. package/dist/ui/logger.js.map +1 -1
  313. package/dist/ui/symbols.d.ts +1 -0
  314. package/dist/ui/symbols.d.ts.map +1 -1
  315. package/dist/ui/symbols.js +7 -1
  316. package/dist/ui/symbols.js.map +1 -1
  317. package/dist/utils/__tests__/address.test.d.ts +2 -0
  318. package/dist/utils/__tests__/address.test.d.ts.map +1 -0
  319. package/dist/utils/__tests__/address.test.js +70 -0
  320. package/dist/utils/__tests__/address.test.js.map +1 -0
  321. package/dist/utils/__tests__/childProcessAdapter.test.d.ts +2 -0
  322. package/dist/utils/__tests__/childProcessAdapter.test.d.ts.map +1 -0
  323. package/dist/utils/__tests__/childProcessAdapter.test.js +217 -0
  324. package/dist/utils/__tests__/childProcessAdapter.test.js.map +1 -0
  325. package/dist/utils/__tests__/runCli.test.d.ts +2 -0
  326. package/dist/utils/__tests__/runCli.test.d.ts.map +1 -0
  327. package/dist/utils/__tests__/runCli.test.js +187 -0
  328. package/dist/utils/__tests__/runCli.test.js.map +1 -0
  329. package/dist/utils/address.d.ts +33 -0
  330. package/dist/utils/address.d.ts.map +1 -0
  331. package/dist/utils/address.js +52 -0
  332. package/dist/utils/address.js.map +1 -0
  333. package/dist/utils/childProcessAdapter.d.ts +93 -0
  334. package/dist/utils/childProcessAdapter.d.ts.map +1 -0
  335. package/dist/utils/childProcessAdapter.js +109 -0
  336. package/dist/utils/childProcessAdapter.js.map +1 -0
  337. package/dist/utils/parseCliOutput.d.ts +20 -0
  338. package/dist/utils/parseCliOutput.d.ts.map +1 -0
  339. package/dist/utils/parseCliOutput.js +26 -0
  340. package/dist/utils/parseCliOutput.js.map +1 -0
  341. package/dist/utils/redact.d.ts +15 -0
  342. package/dist/utils/redact.d.ts.map +1 -0
  343. package/dist/utils/redact.js +24 -0
  344. package/dist/utils/redact.js.map +1 -0
  345. package/dist/utils/runCli.d.ts +24 -0
  346. package/dist/utils/runCli.d.ts.map +1 -0
  347. package/dist/utils/runCli.js +37 -0
  348. package/dist/utils/runCli.js.map +1 -0
  349. package/package.json +14 -4
  350. package/src/__tests__/deployContract.test.ts +429 -0
  351. package/src/__tests__/errors.test.ts +84 -0
  352. package/src/__tests__/fixtures/sigint-deploy-harness.ts +95 -0
  353. package/src/__tests__/fork/api.test.ts +143 -0
  354. package/src/__tests__/harness/Harness.createLive.test.ts +57 -0
  355. package/src/__tests__/harness/Harness.proxy.test.ts +115 -0
  356. package/src/__tests__/harness/_fixture.ts +131 -0
  357. package/src/__tests__/harness/codeObject.deploy.test.ts +319 -0
  358. package/src/__tests__/harness/codeObject.upgrade.test.ts +156 -0
  359. package/src/__tests__/harness/script.test.ts +245 -0
  360. package/src/__tests__/harness/view.test.ts +104 -0
  361. package/src/__tests__/runtime.test.ts +182 -0
  362. package/src/cli.ts +2 -1
  363. package/src/commands/__tests__/compile.test.ts +407 -0
  364. package/src/commands/__tests__/init.test.ts +125 -0
  365. package/src/commands/__tests__/run.test.ts +192 -0
  366. package/src/commands/__tests__/test-move.test.ts +81 -0
  367. package/src/commands/__tests__/test.test.ts +204 -0
  368. package/src/commands/__tests__/update.test.ts +223 -0
  369. package/src/commands/compile.ts +168 -32
  370. package/src/commands/fork/__tests__/create.test.ts +132 -0
  371. package/src/commands/fork/__tests__/fund.test.ts +104 -0
  372. package/src/commands/fork/__tests__/list.test.ts +139 -0
  373. package/src/commands/fork/__tests__/serve.test.ts +121 -0
  374. package/src/commands/fork/__tests__/view-resource.test.ts +101 -0
  375. package/src/commands/fork/create.ts +4 -3
  376. package/src/commands/fork/fund.ts +16 -9
  377. package/src/commands/fork/list.ts +3 -2
  378. package/src/commands/fork/serve.ts +6 -3
  379. package/src/commands/fork/view-resource.ts +11 -6
  380. package/src/commands/run.ts +54 -28
  381. package/src/commands/test-move.ts +4 -3
  382. package/src/commands/test.ts +56 -44
  383. package/src/commands/update.ts +19 -16
  384. package/src/core/AccountManager.ts +23 -10
  385. package/src/core/Publisher.ts +322 -0
  386. package/src/core/__tests__/AccountManager.test.ts +290 -0
  387. package/src/core/__tests__/config.test.ts +377 -0
  388. package/src/core/__tests__/deployments.test.ts +247 -0
  389. package/src/core/__tests__/shell.test.ts +138 -0
  390. package/src/core/config.ts +96 -12
  391. package/src/core/contract.ts +13 -4
  392. package/src/core/deployments.ts +13 -11
  393. package/src/core/movementProfile.ts +179 -0
  394. package/src/core/shell.ts +34 -14
  395. package/src/errors.ts +60 -0
  396. package/src/fork/__tests__/manager.test.ts +385 -0
  397. package/src/fork/__tests__/server.test.ts +65 -0
  398. package/src/fork/__tests__/storage.test.ts +281 -0
  399. package/src/fork/__tests__/test.test.ts +97 -0
  400. package/src/fork/api.ts +28 -14
  401. package/src/fork/manager.ts +88 -43
  402. package/src/fork/server.ts +53 -19
  403. package/src/fork/storage.ts +12 -15
  404. package/src/fork/test.ts +58 -32
  405. package/src/harness/Harness.ts +228 -0
  406. package/src/harness/codeObject.ts +388 -0
  407. package/src/harness/errors.ts +22 -0
  408. package/src/harness/index.ts +3 -0
  409. package/src/harness/proxy.ts +40 -0
  410. package/src/harness/script.ts +196 -0
  411. package/src/harness/view.ts +34 -0
  412. package/src/helpers/__tests__/semver-utils.test.ts +121 -0
  413. package/src/helpers/index.ts +2 -8
  414. package/src/helpers/move-tests.ts +27 -23
  415. package/src/helpers/npm-registry.ts +4 -3
  416. package/src/helpers/semver-utils.ts +4 -3
  417. package/src/helpers/setup.ts +9 -5
  418. package/src/helpers/setupLocalTesting.ts +219 -200
  419. package/src/helpers/testFixtures.ts +106 -118
  420. package/src/index.ts +9 -3
  421. package/src/node/LocalNodeManager.ts +87 -62
  422. package/src/node/__tests__/LocalNodeManager.test.ts +452 -0
  423. package/src/runtime.ts +33 -289
  424. package/src/templates/README.md +1 -1
  425. package/src/templates/movehat.config.ts +10 -0
  426. package/src/templates/package.json +2 -1
  427. package/src/templates/scripts/deploy-counter.ts +46 -38
  428. package/src/templates/tests/Counter.test.ts +51 -51
  429. package/src/templates/types/movehat.d.ts +6 -9
  430. package/src/types/config.ts +8 -0
  431. package/src/types/fork.ts +7 -1
  432. package/src/types/harness.ts +182 -0
  433. package/src/types/runtime.ts +11 -3
  434. package/src/ui/__tests__/colors.test.ts +156 -0
  435. package/src/ui/colors.ts +5 -2
  436. package/src/ui/logger.ts +22 -0
  437. package/src/ui/symbols.ts +7 -1
  438. package/src/utils/__tests__/address.test.ts +93 -0
  439. package/src/utils/__tests__/childProcessAdapter.test.ts +266 -0
  440. package/src/utils/__tests__/runCli.test.ts +240 -0
  441. package/src/utils/address.ts +56 -0
  442. package/src/utils/childProcessAdapter.ts +215 -0
  443. package/src/utils/parseCliOutput.ts +27 -0
  444. package/src/utils/redact.ts +24 -0
  445. package/src/utils/runCli.ts +64 -0
@@ -0,0 +1,452 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { EventEmitter } from "node:events";
3
+ import { PassThrough } from "node:stream";
4
+ import { mkdtempSync, rmSync, existsSync, mkdirSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
+
8
+ import { LocalNodeManager } from "../LocalNodeManager.js";
9
+ import type {
10
+ ChildProcessAdapter,
11
+ SpawnInput,
12
+ SpawnedProcess,
13
+ } from "../../utils/childProcessAdapter.js";
14
+
15
+ /**
16
+ * Tests for `LocalNodeManager` (M3.3).
17
+ *
18
+ * Strategy:
19
+ * - Inject a fake `ChildProcessAdapter` so we control the spawn
20
+ * handle (stdout/stderr streams, kill semantics, exit promise).
21
+ * - Stub global `fetch` so the ready/faucet endpoints return
22
+ * controllable responses without real HTTP.
23
+ *
24
+ * What we DON'T test here:
25
+ * - The 60-second ready timeout in real-time (would block the suite).
26
+ * Instead we either stub fetch to succeed on first call, or for the
27
+ * timeout-path test we shrink the timeout via a wrapper that bypasses
28
+ * `start()` and calls a faster path. The timeout error message is
29
+ * verified by exercising `start()` with a never-ready fetch and
30
+ * fake timers.
31
+ */
32
+
33
+ interface FakeSpawnedProcess extends SpawnedProcess {
34
+ /** Test helper — manually trigger the "exited" promise resolution. */
35
+ __exit: (code: number | null, signal: NodeJS.Signals | null) => void;
36
+ }
37
+
38
+ function buildFakeSpawned(): FakeSpawnedProcess {
39
+ const stdout = new PassThrough();
40
+ const stderr = new PassThrough();
41
+ const stdin = new PassThrough();
42
+ let exitResolve!: (v: { code: number | null; signal: NodeJS.Signals | null }) => void;
43
+ const exited = new Promise<{ code: number | null; signal: NodeJS.Signals | null }>(
44
+ (resolve) => {
45
+ exitResolve = resolve;
46
+ }
47
+ );
48
+ let killed = false;
49
+ const proc: FakeSpawnedProcess = {
50
+ pid: 4242,
51
+ stdout,
52
+ stderr,
53
+ stdin,
54
+ kill: (_signal?: NodeJS.Signals) => {
55
+ if (killed) return false;
56
+ killed = true;
57
+ // Resolve `exited` shortly after kill so `stop()` doesn't hang.
58
+ setImmediate(() => exitResolve({ code: null, signal: _signal ?? "SIGTERM" }));
59
+ return true;
60
+ },
61
+ exited,
62
+ __exit: (code, signal) => exitResolve({ code, signal }),
63
+ };
64
+ return proc;
65
+ }
66
+
67
+ function buildFakeAdapter(): {
68
+ adapter: ChildProcessAdapter;
69
+ calls: SpawnInput[];
70
+ spawned: FakeSpawnedProcess[];
71
+ } {
72
+ const calls: SpawnInput[] = [];
73
+ const spawned: FakeSpawnedProcess[] = [];
74
+ const adapter: ChildProcessAdapter = {
75
+ run: vi.fn(),
76
+ spawn: (input) => {
77
+ calls.push(input);
78
+ const proc = buildFakeSpawned();
79
+ spawned.push(proc);
80
+ return proc;
81
+ },
82
+ };
83
+ return { adapter, calls, spawned };
84
+ }
85
+
86
+ function stubFetchOnce(response: { ok: boolean; text?: () => Promise<string>; json?: () => Promise<unknown> }) {
87
+ const fn = vi.fn().mockResolvedValueOnce(response);
88
+ vi.stubGlobal("fetch", fn);
89
+ return fn;
90
+ }
91
+
92
+ function stubFetchAlwaysOk() {
93
+ const fn = vi.fn().mockResolvedValue({ ok: true, json: async () => ({}) });
94
+ vi.stubGlobal("fetch", fn);
95
+ return fn;
96
+ }
97
+
98
+ describe("LocalNodeManager — start / stop / lifecycle", () => {
99
+ let tmpDir: string;
100
+ let logSpy: ReturnType<typeof vi.spyOn>;
101
+ let errSpy: ReturnType<typeof vi.spyOn>;
102
+
103
+ beforeEach(() => {
104
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-localnode-"));
105
+ // The logger prints to stdout/stderr; silence the noise for cleaner test output.
106
+ logSpy = vi.spyOn(console, "log").mockImplementation(() => undefined);
107
+ errSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
108
+ });
109
+
110
+ afterEach(() => {
111
+ vi.restoreAllMocks();
112
+ vi.unstubAllGlobals();
113
+ if (existsSync(tmpDir)) {
114
+ rmSync(tmpDir, { recursive: true, force: true });
115
+ }
116
+ });
117
+
118
+ it("constructs with sensible defaults from getNodeInfo", () => {
119
+ const { adapter } = buildFakeAdapter();
120
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir });
121
+
122
+ const info = mgr.getNodeInfo();
123
+ expect(info.rpcUrl).toBe("http://127.0.0.1:8080");
124
+ expect(info.faucetUrl).toBe("http://127.0.0.1:8081");
125
+ expect(info.readyUrl).toBe("http://127.0.0.1:8070");
126
+ expect(info.testDir).toBe(tmpDir);
127
+ });
128
+
129
+ it("honors custom ports from constructor options", () => {
130
+ const { adapter } = buildFakeAdapter();
131
+ const mgr = new LocalNodeManager({
132
+ adapter,
133
+ testDir: tmpDir,
134
+ apiPort: 9000,
135
+ faucetPort: 9001,
136
+ readyPort: 9002,
137
+ });
138
+ const info = mgr.getNodeInfo();
139
+ expect(info.rpcUrl).toContain(":9000");
140
+ expect(info.faucetUrl).toContain(":9001");
141
+ expect(info.readyUrl).toContain(":9002");
142
+ });
143
+
144
+ it("isRunning reports false before start", () => {
145
+ const { adapter } = buildFakeAdapter();
146
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir });
147
+ expect(mgr.isRunning()).toBe(false);
148
+ });
149
+
150
+ it("start spawns 'movement node run-localnet' with the expected args", async () => {
151
+ const { adapter, calls } = buildFakeAdapter();
152
+ stubFetchAlwaysOk();
153
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
154
+
155
+ await mgr.start();
156
+
157
+ expect(calls).toHaveLength(1);
158
+ expect(calls[0]?.command).toBe("movement");
159
+ const args = calls[0]?.args ?? [];
160
+ expect(args.slice(0, 2)).toEqual(["node", "run-localnet"]);
161
+ expect(args).toContain("--test-dir");
162
+ expect(args).toContain(tmpDir);
163
+ expect(args).toContain("--faucet-port");
164
+ expect(args).toContain("8081");
165
+ expect(args).toContain("--assume-yes");
166
+ expect(mgr.isRunning()).toBe(true);
167
+ });
168
+
169
+ it("start in silent mode does not wire stdout/stderr listeners", async () => {
170
+ const { adapter, spawned } = buildFakeAdapter();
171
+ stubFetchAlwaysOk();
172
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
173
+
174
+ await mgr.start();
175
+
176
+ // The PassThrough streams should have no `data` listeners attached
177
+ // when `silent: true` is set.
178
+ const proc = spawned[0]!;
179
+ expect(proc.stdout!.listenerCount("data")).toBe(0);
180
+ expect(proc.stderr!.listenerCount("data")).toBe(0);
181
+ });
182
+
183
+ it("start in non-silent mode wires stdout/stderr listeners that log events", async () => {
184
+ const { adapter, spawned } = buildFakeAdapter();
185
+ stubFetchAlwaysOk();
186
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: false });
187
+
188
+ await mgr.start();
189
+
190
+ const proc = spawned[0]!;
191
+ expect(proc.stdout!.listenerCount("data")).toBeGreaterThan(0);
192
+ expect(proc.stderr!.listenerCount("data")).toBeGreaterThan(0);
193
+
194
+ // Drive a line through stdout — the manager's listener forwards to console.log.
195
+ proc.stdout!.emit("data", Buffer.from("local node ready\n"));
196
+ expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("local node ready"));
197
+
198
+ // stderr non-WARN line goes through console.error.
199
+ proc.stderr!.emit("data", Buffer.from("real error\n"));
200
+ expect(errSpy).toHaveBeenCalledWith(expect.stringContaining("real error"));
201
+
202
+ // stderr WARN line should be filtered (no error log).
203
+ errSpy.mockClear();
204
+ proc.stderr!.emit("data", Buffer.from("WARN something\n"));
205
+ expect(errSpy).not.toHaveBeenCalledWith(expect.stringContaining("WARN"));
206
+ });
207
+
208
+ it("force-restart cleans the test directory before spawn", async () => {
209
+ const { adapter } = buildFakeAdapter();
210
+ stubFetchAlwaysOk();
211
+ const planted = join(tmpDir, "stale-file.txt");
212
+ // Create a stale file to prove the cleanup actually removes it.
213
+ mkdirSync(tmpDir, { recursive: true });
214
+ require("node:fs").writeFileSync(planted, "stale");
215
+ expect(existsSync(planted)).toBe(true);
216
+
217
+ const mgr = new LocalNodeManager({
218
+ adapter,
219
+ testDir: tmpDir,
220
+ forceRestart: true,
221
+ silent: true,
222
+ });
223
+
224
+ await mgr.start();
225
+ expect(existsSync(planted)).toBe(false);
226
+ });
227
+
228
+ it("force-restart appends --force-restart to the CLI args", async () => {
229
+ const { adapter, calls } = buildFakeAdapter();
230
+ stubFetchAlwaysOk();
231
+ const mgr = new LocalNodeManager({
232
+ adapter,
233
+ testDir: tmpDir,
234
+ forceRestart: true,
235
+ silent: true,
236
+ });
237
+ await mgr.start();
238
+ expect(calls[0]?.args).toContain("--force-restart");
239
+ });
240
+
241
+ it("calling start twice returns the same node info (idempotent)", async () => {
242
+ const { adapter, calls } = buildFakeAdapter();
243
+ stubFetchAlwaysOk();
244
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
245
+
246
+ const info1 = await mgr.start();
247
+ const info2 = await mgr.start();
248
+ expect(info2).toEqual(info1);
249
+ expect(calls).toHaveLength(1);
250
+ });
251
+
252
+ it("stop signals SIGTERM and clears the spawned handle", async () => {
253
+ const { adapter, spawned } = buildFakeAdapter();
254
+ stubFetchAlwaysOk();
255
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
256
+ await mgr.start();
257
+
258
+ const killSpy = vi.spyOn(spawned[0]!, "kill");
259
+ await mgr.stop();
260
+
261
+ expect(killSpy).toHaveBeenCalledWith("SIGTERM");
262
+ expect(mgr.isRunning()).toBe(false);
263
+ });
264
+
265
+ it("stop is a no-op when no node is running", async () => {
266
+ const { adapter } = buildFakeAdapter();
267
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir });
268
+ // Should not throw.
269
+ await mgr.stop();
270
+ expect(mgr.isRunning()).toBe(false);
271
+ });
272
+
273
+ it("clean refuses while the node is running", async () => {
274
+ const { adapter } = buildFakeAdapter();
275
+ stubFetchAlwaysOk();
276
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
277
+ await mgr.start();
278
+
279
+ await expect(mgr.clean()).rejects.toThrow(/Cannot clean while node is running/);
280
+ });
281
+
282
+ it("clean removes the test directory after stop", async () => {
283
+ const { adapter } = buildFakeAdapter();
284
+ stubFetchAlwaysOk();
285
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
286
+ await mgr.start();
287
+ await mgr.stop();
288
+
289
+ expect(existsSync(tmpDir)).toBe(true);
290
+ await mgr.clean();
291
+ expect(existsSync(tmpDir)).toBe(false);
292
+ });
293
+
294
+ it("clean is a no-op when the test directory doesn't exist", async () => {
295
+ const { adapter } = buildFakeAdapter();
296
+ const missing = join(tmpDir, "never-created");
297
+ const mgr = new LocalNodeManager({ adapter, testDir: missing });
298
+ // Should not throw.
299
+ await mgr.clean();
300
+ });
301
+ });
302
+
303
+ describe("LocalNodeManager — start failure paths", () => {
304
+ let tmpDir: string;
305
+
306
+ beforeEach(() => {
307
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-localnode-"));
308
+ vi.spyOn(console, "log").mockImplementation(() => undefined);
309
+ vi.spyOn(console, "error").mockImplementation(() => undefined);
310
+ });
311
+
312
+ afterEach(() => {
313
+ vi.restoreAllMocks();
314
+ vi.unstubAllGlobals();
315
+ if (existsSync(tmpDir)) rmSync(tmpDir, { recursive: true, force: true });
316
+ });
317
+
318
+ it("waitForReady timeout surfaces a clear error AND cleans up the spawn", async () => {
319
+ const { adapter, spawned } = buildFakeAdapter();
320
+ // Always-failing fetch — node never becomes ready.
321
+ vi.stubGlobal(
322
+ "fetch",
323
+ vi.fn().mockRejectedValue(new Error("ECONNREFUSED"))
324
+ );
325
+
326
+ vi.useFakeTimers();
327
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
328
+
329
+ // Attach the .catch handler synchronously so the eventual rejection
330
+ // never lands as an unhandled promise. vi.advanceTimersByTimeAsync
331
+ // drives the waitForReady loop forward; we then await the captured
332
+ // error and assert on it.
333
+ let captured: unknown;
334
+ const startPromise = mgr.start().catch((e) => {
335
+ captured = e;
336
+ });
337
+
338
+ // Drive the 60s timeout forward — each loop iteration does fetch +
339
+ // sleep(1000). Advance well past 60 000 ms.
340
+ await vi.advanceTimersByTimeAsync(61_000);
341
+ await startPromise;
342
+
343
+ expect(captured).toBeInstanceOf(Error);
344
+ expect((captured as Error).message).toMatch(/did not become ready/);
345
+ // The spawn handle must have been killed in the catch arm.
346
+ expect(spawned[0]).toBeDefined();
347
+ expect(mgr.isRunning()).toBe(false);
348
+ vi.useRealTimers();
349
+ });
350
+ });
351
+
352
+ describe("LocalNodeManager — fundAccount", () => {
353
+ let tmpDir: string;
354
+
355
+ beforeEach(() => {
356
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-localnode-"));
357
+ vi.spyOn(console, "log").mockImplementation(() => undefined);
358
+ vi.spyOn(console, "error").mockImplementation(() => undefined);
359
+ });
360
+
361
+ afterEach(() => {
362
+ vi.restoreAllMocks();
363
+ vi.unstubAllGlobals();
364
+ if (existsSync(tmpDir)) rmSync(tmpDir, { recursive: true, force: true });
365
+ });
366
+
367
+ it("rejects when called before the node is running", async () => {
368
+ const { adapter } = buildFakeAdapter();
369
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir });
370
+ await expect(mgr.fundAccount("0xabc", 100)).rejects.toThrow(
371
+ /Local node is not running/
372
+ );
373
+ });
374
+
375
+ it("posts to the faucet endpoint and returns the parsed JSON on success", async () => {
376
+ const { adapter } = buildFakeAdapter();
377
+ // First fetch = ready check; subsequent = faucet mint.
378
+ const fetchFn = vi.fn();
379
+ fetchFn.mockResolvedValueOnce({ ok: true }); // waitForReady
380
+ fetchFn.mockResolvedValueOnce({
381
+ ok: true,
382
+ json: async () => ({ txn_hashes: ["0xdeadbeef"] }),
383
+ }); // faucet
384
+ vi.stubGlobal("fetch", fetchFn);
385
+
386
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
387
+ await mgr.start();
388
+
389
+ const addr = "0x" + "1".repeat(64);
390
+ const result = await mgr.fundAccount(addr, 12345);
391
+
392
+ expect(result).toEqual({ txn_hashes: ["0xdeadbeef"] });
393
+ const faucetCall = fetchFn.mock.calls[1]!;
394
+ expect(faucetCall[0]).toContain("/mint?amount=12345&address=" + addr);
395
+ expect(faucetCall[1]?.method).toBe("POST");
396
+ });
397
+
398
+ it("rethrows a clear error when the faucet returns non-ok", async () => {
399
+ const { adapter } = buildFakeAdapter();
400
+ const fetchFn = vi.fn();
401
+ fetchFn.mockResolvedValueOnce({ ok: true }); // waitForReady
402
+ fetchFn.mockResolvedValueOnce({
403
+ ok: false,
404
+ text: async () => "out of funds",
405
+ json: async () => ({}),
406
+ });
407
+ vi.stubGlobal("fetch", fetchFn);
408
+
409
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
410
+ await mgr.start();
411
+
412
+ await expect(mgr.fundAccount("0xabc", 100)).rejects.toThrow(
413
+ /Failed to fund account.*out of funds/
414
+ );
415
+ });
416
+
417
+ it("fundAccount accepts an Account-like object by reading accountAddress.toString()", async () => {
418
+ const { adapter } = buildFakeAdapter();
419
+ const fetchFn = vi.fn();
420
+ fetchFn.mockResolvedValueOnce({ ok: true }); // waitForReady
421
+ fetchFn.mockResolvedValueOnce({
422
+ ok: true,
423
+ json: async () => ({}),
424
+ });
425
+ vi.stubGlobal("fetch", fetchFn);
426
+
427
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
428
+ await mgr.start();
429
+
430
+ const fakeAccount = {
431
+ accountAddress: { toString: () => "0xfeedbeef" },
432
+ } as never; // exercises the typeof-not-string branch
433
+
434
+ await mgr.fundAccount(fakeAccount, 100);
435
+ expect(fetchFn.mock.calls[1]![0]).toContain("address=0xfeedbeef");
436
+ });
437
+
438
+ it("fundAccounts iterates and funds each account in turn", async () => {
439
+ const { adapter } = buildFakeAdapter();
440
+ const fetchFn = vi.fn();
441
+ fetchFn.mockResolvedValueOnce({ ok: true }); // waitForReady
442
+ fetchFn.mockResolvedValue({ ok: true, json: async () => ({}) });
443
+ vi.stubGlobal("fetch", fetchFn);
444
+
445
+ const mgr = new LocalNodeManager({ adapter, testDir: tmpDir, silent: true });
446
+ await mgr.start();
447
+
448
+ await mgr.fundAccounts(["0x1", "0x2", "0x3"], 100);
449
+ // 1 ready + 3 mint calls = 4 total.
450
+ expect(fetchFn.mock.calls.length).toBeGreaterThanOrEqual(4);
451
+ });
452
+ });