movehat 0.2.4 → 0.2.6

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 (557) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.d.ts +0 -1
  3. package/dist/cli.js +0 -1
  4. package/dist/commands/compile.d.ts +0 -1
  5. package/dist/commands/compile.js +0 -1
  6. package/dist/commands/fork/create.d.ts +1 -1
  7. package/dist/commands/fork/create.js +18 -3
  8. package/dist/commands/fork/fund.d.ts +0 -1
  9. package/dist/commands/fork/fund.js +0 -1
  10. package/dist/commands/fork/list.d.ts +0 -1
  11. package/dist/commands/fork/list.js +0 -1
  12. package/dist/commands/fork/serve.d.ts +0 -1
  13. package/dist/commands/fork/serve.js +0 -1
  14. package/dist/commands/fork/view-resource.d.ts +0 -1
  15. package/dist/commands/fork/view-resource.js +0 -1
  16. package/dist/commands/init.d.ts +0 -1
  17. package/dist/commands/init.js +0 -1
  18. package/dist/commands/run.d.ts +17 -1
  19. package/dist/commands/run.js +46 -33
  20. package/dist/commands/test-move.d.ts +0 -1
  21. package/dist/commands/test-move.js +0 -1
  22. package/dist/commands/test.d.ts +0 -1
  23. package/dist/commands/test.js +8 -1
  24. package/dist/commands/update.d.ts +0 -1
  25. package/dist/commands/update.js +0 -1
  26. package/dist/core/AccountManager.d.ts +15 -2
  27. package/dist/core/AccountManager.js +32 -20
  28. package/dist/core/Publisher.d.ts +0 -1
  29. package/dist/core/Publisher.js +0 -1
  30. package/dist/core/config.d.ts +0 -1
  31. package/dist/core/config.js +109 -28
  32. package/dist/core/contract.d.ts +0 -1
  33. package/dist/core/contract.js +0 -1
  34. package/dist/core/deployments.d.ts +0 -1
  35. package/dist/core/deployments.js +0 -1
  36. package/dist/core/movementProfile.d.ts +0 -1
  37. package/dist/core/movementProfile.js +0 -1
  38. package/dist/core/shell.d.ts +0 -1
  39. package/dist/core/shell.js +0 -1
  40. package/dist/errors.d.ts +0 -1
  41. package/dist/errors.js +0 -1
  42. package/dist/fork/api.d.ts +24 -1
  43. package/dist/fork/api.js +95 -1
  44. package/dist/fork/manager.d.ts +14 -1
  45. package/dist/fork/manager.js +19 -1
  46. package/dist/fork/server.d.ts +19 -1
  47. package/dist/fork/server.js +188 -8
  48. package/dist/fork/storage.d.ts +0 -1
  49. package/dist/fork/storage.js +50 -32
  50. package/dist/fork/test.d.ts +0 -1
  51. package/dist/fork/test.js +0 -1
  52. package/dist/harness/Harness.d.ts +0 -1
  53. package/dist/harness/Harness.js +6 -2
  54. package/dist/harness/codeObject.d.ts +0 -1
  55. package/dist/harness/codeObject.js +0 -1
  56. package/dist/harness/errors.d.ts +0 -1
  57. package/dist/harness/errors.js +0 -1
  58. package/dist/harness/index.d.ts +0 -1
  59. package/dist/harness/index.js +0 -1
  60. package/dist/harness/proxy.d.ts +12 -1
  61. package/dist/harness/proxy.js +23 -1
  62. package/dist/harness/script.d.ts +0 -1
  63. package/dist/harness/script.js +0 -1
  64. package/dist/harness/view.d.ts +0 -1
  65. package/dist/harness/view.js +0 -1
  66. package/dist/helpers/assertions.d.ts +0 -1
  67. package/dist/helpers/assertions.js +0 -1
  68. package/dist/helpers/banner.d.ts +0 -1
  69. package/dist/helpers/banner.js +0 -1
  70. package/dist/helpers/index.d.ts +0 -1
  71. package/dist/helpers/index.js +0 -1
  72. package/dist/helpers/move-tests.d.ts +0 -1
  73. package/dist/helpers/move-tests.js +0 -1
  74. package/dist/helpers/npm-registry.d.ts +0 -1
  75. package/dist/helpers/npm-registry.js +0 -1
  76. package/dist/helpers/semver-utils.d.ts +0 -1
  77. package/dist/helpers/semver-utils.js +0 -1
  78. package/dist/helpers/setup.d.ts +0 -1
  79. package/dist/helpers/setup.js +0 -1
  80. package/dist/helpers/setupLocalTesting.d.ts +2 -5
  81. package/dist/helpers/setupLocalTesting.js +0 -1
  82. package/dist/helpers/testFixtures.d.ts +0 -1
  83. package/dist/helpers/testFixtures.js +0 -1
  84. package/dist/helpers/version-check.d.ts +0 -1
  85. package/dist/helpers/version-check.js +0 -1
  86. package/dist/index.d.ts +0 -1
  87. package/dist/index.js +0 -1
  88. package/dist/node/LocalNodeManager.d.ts +0 -1
  89. package/dist/node/LocalNodeManager.js +4 -2
  90. package/dist/runtime.d.ts +0 -1
  91. package/dist/runtime.js +0 -1
  92. package/dist/types/config.d.ts +0 -1
  93. package/dist/types/config.js +0 -1
  94. package/dist/types/fork.d.ts +0 -1
  95. package/dist/types/fork.js +0 -1
  96. package/dist/types/harness.d.ts +0 -1
  97. package/dist/types/harness.js +0 -1
  98. package/dist/types/runtime.d.ts +0 -1
  99. package/dist/types/runtime.js +0 -1
  100. package/dist/ui/colors.d.ts +0 -1
  101. package/dist/ui/colors.js +0 -1
  102. package/dist/ui/formatters.d.ts +0 -1
  103. package/dist/ui/formatters.js +0 -1
  104. package/dist/ui/index.d.ts +0 -1
  105. package/dist/ui/index.js +0 -1
  106. package/dist/ui/logger.d.ts +0 -1
  107. package/dist/ui/logger.js +0 -1
  108. package/dist/ui/spinner.d.ts +0 -1
  109. package/dist/ui/spinner.js +0 -1
  110. package/dist/ui/symbols.d.ts +0 -1
  111. package/dist/ui/symbols.js +0 -1
  112. package/dist/ui/table.d.ts +0 -1
  113. package/dist/ui/table.js +0 -1
  114. package/dist/utils/address.d.ts +0 -1
  115. package/dist/utils/address.js +0 -1
  116. package/dist/utils/childProcessAdapter.d.ts +0 -1
  117. package/dist/utils/childProcessAdapter.js +46 -20
  118. package/dist/utils/movementCli.d.ts +5 -0
  119. package/dist/utils/movementCli.js +91 -0
  120. package/dist/utils/parseCliOutput.d.ts +6 -4
  121. package/dist/utils/parseCliOutput.js +10 -6
  122. package/dist/utils/redact.d.ts +3 -3
  123. package/dist/utils/redact.js +6 -5
  124. package/dist/utils/runCli.d.ts +0 -1
  125. package/dist/utils/runCli.js +10 -2
  126. package/package.json +4 -4
  127. package/dist/__tests__/deployContract.test.d.ts +0 -2
  128. package/dist/__tests__/deployContract.test.d.ts.map +0 -1
  129. package/dist/__tests__/deployContract.test.js +0 -377
  130. package/dist/__tests__/deployContract.test.js.map +0 -1
  131. package/dist/__tests__/errors.test.d.ts +0 -2
  132. package/dist/__tests__/errors.test.d.ts.map +0 -1
  133. package/dist/__tests__/errors.test.js +0 -46
  134. package/dist/__tests__/errors.test.js.map +0 -1
  135. package/dist/__tests__/exports.test.d.ts +0 -2
  136. package/dist/__tests__/exports.test.d.ts.map +0 -1
  137. package/dist/__tests__/exports.test.js +0 -30
  138. package/dist/__tests__/exports.test.js.map +0 -1
  139. package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +0 -25
  140. package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +0 -1
  141. package/dist/__tests__/fixtures/sigint-deploy-harness.js +0 -83
  142. package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +0 -1
  143. package/dist/__tests__/fork/api.test.d.ts +0 -2
  144. package/dist/__tests__/fork/api.test.d.ts.map +0 -1
  145. package/dist/__tests__/fork/api.test.js +0 -115
  146. package/dist/__tests__/fork/api.test.js.map +0 -1
  147. package/dist/__tests__/fork/api.timeout.test.d.ts +0 -2
  148. package/dist/__tests__/fork/api.timeout.test.d.ts.map +0 -1
  149. package/dist/__tests__/fork/api.timeout.test.js +0 -98
  150. package/dist/__tests__/fork/api.timeout.test.js.map +0 -1
  151. package/dist/__tests__/harness/Harness.createLive.test.d.ts +0 -2
  152. package/dist/__tests__/harness/Harness.createLive.test.d.ts.map +0 -1
  153. package/dist/__tests__/harness/Harness.createLive.test.js +0 -53
  154. package/dist/__tests__/harness/Harness.createLive.test.js.map +0 -1
  155. package/dist/__tests__/harness/Harness.proxy.test.d.ts +0 -2
  156. package/dist/__tests__/harness/Harness.proxy.test.d.ts.map +0 -1
  157. package/dist/__tests__/harness/Harness.proxy.test.js +0 -89
  158. package/dist/__tests__/harness/Harness.proxy.test.js.map +0 -1
  159. package/dist/__tests__/harness/_fixture.d.ts +0 -54
  160. package/dist/__tests__/harness/_fixture.d.ts.map +0 -1
  161. package/dist/__tests__/harness/_fixture.js +0 -69
  162. package/dist/__tests__/harness/_fixture.js.map +0 -1
  163. package/dist/__tests__/harness/codeObject.deploy.test.d.ts +0 -2
  164. package/dist/__tests__/harness/codeObject.deploy.test.d.ts.map +0 -1
  165. package/dist/__tests__/harness/codeObject.deploy.test.js +0 -288
  166. package/dist/__tests__/harness/codeObject.deploy.test.js.map +0 -1
  167. package/dist/__tests__/harness/codeObject.upgrade.test.d.ts +0 -2
  168. package/dist/__tests__/harness/codeObject.upgrade.test.d.ts.map +0 -1
  169. package/dist/__tests__/harness/codeObject.upgrade.test.js +0 -138
  170. package/dist/__tests__/harness/codeObject.upgrade.test.js.map +0 -1
  171. package/dist/__tests__/harness/script.test.d.ts +0 -2
  172. package/dist/__tests__/harness/script.test.d.ts.map +0 -1
  173. package/dist/__tests__/harness/script.test.js +0 -219
  174. package/dist/__tests__/harness/script.test.js.map +0 -1
  175. package/dist/__tests__/harness/view.test.d.ts +0 -2
  176. package/dist/__tests__/harness/view.test.d.ts.map +0 -1
  177. package/dist/__tests__/harness/view.test.js +0 -92
  178. package/dist/__tests__/harness/view.test.js.map +0 -1
  179. package/dist/__tests__/runtime.test.d.ts +0 -2
  180. package/dist/__tests__/runtime.test.d.ts.map +0 -1
  181. package/dist/__tests__/runtime.test.js +0 -141
  182. package/dist/__tests__/runtime.test.js.map +0 -1
  183. package/dist/cli.d.ts.map +0 -1
  184. package/dist/cli.js.map +0 -1
  185. package/dist/commands/__tests__/compile.test.d.ts +0 -2
  186. package/dist/commands/__tests__/compile.test.d.ts.map +0 -1
  187. package/dist/commands/__tests__/compile.test.js +0 -351
  188. package/dist/commands/__tests__/compile.test.js.map +0 -1
  189. package/dist/commands/__tests__/compile.toml-mutation.test.d.ts +0 -2
  190. package/dist/commands/__tests__/compile.toml-mutation.test.d.ts.map +0 -1
  191. package/dist/commands/__tests__/compile.toml-mutation.test.js +0 -69
  192. package/dist/commands/__tests__/compile.toml-mutation.test.js.map +0 -1
  193. package/dist/commands/__tests__/init.test.d.ts +0 -2
  194. package/dist/commands/__tests__/init.test.d.ts.map +0 -1
  195. package/dist/commands/__tests__/init.test.js +0 -163
  196. package/dist/commands/__tests__/init.test.js.map +0 -1
  197. package/dist/commands/__tests__/run.test.d.ts +0 -2
  198. package/dist/commands/__tests__/run.test.d.ts.map +0 -1
  199. package/dist/commands/__tests__/run.test.js +0 -166
  200. package/dist/commands/__tests__/run.test.js.map +0 -1
  201. package/dist/commands/__tests__/test-move.test.d.ts +0 -2
  202. package/dist/commands/__tests__/test-move.test.d.ts.map +0 -1
  203. package/dist/commands/__tests__/test-move.test.js +0 -59
  204. package/dist/commands/__tests__/test-move.test.js.map +0 -1
  205. package/dist/commands/__tests__/test.test.d.ts +0 -2
  206. package/dist/commands/__tests__/test.test.d.ts.map +0 -1
  207. package/dist/commands/__tests__/test.test.js +0 -168
  208. package/dist/commands/__tests__/test.test.js.map +0 -1
  209. package/dist/commands/__tests__/update.test.d.ts +0 -2
  210. package/dist/commands/__tests__/update.test.d.ts.map +0 -1
  211. package/dist/commands/__tests__/update.test.js +0 -176
  212. package/dist/commands/__tests__/update.test.js.map +0 -1
  213. package/dist/commands/compile.d.ts.map +0 -1
  214. package/dist/commands/compile.js.map +0 -1
  215. package/dist/commands/fork/__tests__/create.test.d.ts +0 -2
  216. package/dist/commands/fork/__tests__/create.test.d.ts.map +0 -1
  217. package/dist/commands/fork/__tests__/create.test.js +0 -108
  218. package/dist/commands/fork/__tests__/create.test.js.map +0 -1
  219. package/dist/commands/fork/__tests__/fund.test.d.ts +0 -2
  220. package/dist/commands/fork/__tests__/fund.test.d.ts.map +0 -1
  221. package/dist/commands/fork/__tests__/fund.test.js +0 -72
  222. package/dist/commands/fork/__tests__/fund.test.js.map +0 -1
  223. package/dist/commands/fork/__tests__/list.test.d.ts +0 -2
  224. package/dist/commands/fork/__tests__/list.test.d.ts.map +0 -1
  225. package/dist/commands/fork/__tests__/list.test.js +0 -119
  226. package/dist/commands/fork/__tests__/list.test.js.map +0 -1
  227. package/dist/commands/fork/__tests__/serve.test.d.ts +0 -2
  228. package/dist/commands/fork/__tests__/serve.test.d.ts.map +0 -1
  229. package/dist/commands/fork/__tests__/serve.test.js +0 -97
  230. package/dist/commands/fork/__tests__/serve.test.js.map +0 -1
  231. package/dist/commands/fork/__tests__/view-resource.test.d.ts +0 -2
  232. package/dist/commands/fork/__tests__/view-resource.test.d.ts.map +0 -1
  233. package/dist/commands/fork/__tests__/view-resource.test.js +0 -77
  234. package/dist/commands/fork/__tests__/view-resource.test.js.map +0 -1
  235. package/dist/commands/fork/create.d.ts.map +0 -1
  236. package/dist/commands/fork/create.js.map +0 -1
  237. package/dist/commands/fork/fund.d.ts.map +0 -1
  238. package/dist/commands/fork/fund.js.map +0 -1
  239. package/dist/commands/fork/list.d.ts.map +0 -1
  240. package/dist/commands/fork/list.js.map +0 -1
  241. package/dist/commands/fork/serve.d.ts.map +0 -1
  242. package/dist/commands/fork/serve.js.map +0 -1
  243. package/dist/commands/fork/view-resource.d.ts.map +0 -1
  244. package/dist/commands/fork/view-resource.js.map +0 -1
  245. package/dist/commands/init.d.ts.map +0 -1
  246. package/dist/commands/init.js.map +0 -1
  247. package/dist/commands/run.d.ts.map +0 -1
  248. package/dist/commands/run.js.map +0 -1
  249. package/dist/commands/test-move.d.ts.map +0 -1
  250. package/dist/commands/test-move.js.map +0 -1
  251. package/dist/commands/test.d.ts.map +0 -1
  252. package/dist/commands/test.js.map +0 -1
  253. package/dist/commands/update.d.ts.map +0 -1
  254. package/dist/commands/update.js.map +0 -1
  255. package/dist/core/AccountManager.d.ts.map +0 -1
  256. package/dist/core/AccountManager.js.map +0 -1
  257. package/dist/core/Publisher.d.ts.map +0 -1
  258. package/dist/core/Publisher.js.map +0 -1
  259. package/dist/core/__tests__/AccountManager.global-state.test.d.ts +0 -2
  260. package/dist/core/__tests__/AccountManager.global-state.test.d.ts.map +0 -1
  261. package/dist/core/__tests__/AccountManager.global-state.test.js +0 -69
  262. package/dist/core/__tests__/AccountManager.global-state.test.js.map +0 -1
  263. package/dist/core/__tests__/AccountManager.test.d.ts +0 -2
  264. package/dist/core/__tests__/AccountManager.test.d.ts.map +0 -1
  265. package/dist/core/__tests__/AccountManager.test.js +0 -239
  266. package/dist/core/__tests__/AccountManager.test.js.map +0 -1
  267. package/dist/core/__tests__/config.test.d.ts +0 -2
  268. package/dist/core/__tests__/config.test.d.ts.map +0 -1
  269. package/dist/core/__tests__/config.test.js +0 -311
  270. package/dist/core/__tests__/config.test.js.map +0 -1
  271. package/dist/core/__tests__/deployments.test.d.ts +0 -2
  272. package/dist/core/__tests__/deployments.test.d.ts.map +0 -1
  273. package/dist/core/__tests__/deployments.test.js +0 -201
  274. package/dist/core/__tests__/deployments.test.js.map +0 -1
  275. package/dist/core/__tests__/movementProfile.test.d.ts +0 -2
  276. package/dist/core/__tests__/movementProfile.test.d.ts.map +0 -1
  277. package/dist/core/__tests__/movementProfile.test.js +0 -112
  278. package/dist/core/__tests__/movementProfile.test.js.map +0 -1
  279. package/dist/core/__tests__/shell.test.d.ts +0 -2
  280. package/dist/core/__tests__/shell.test.d.ts.map +0 -1
  281. package/dist/core/__tests__/shell.test.js +0 -107
  282. package/dist/core/__tests__/shell.test.js.map +0 -1
  283. package/dist/core/config.d.ts.map +0 -1
  284. package/dist/core/config.js.map +0 -1
  285. package/dist/core/contract.d.ts.map +0 -1
  286. package/dist/core/contract.js.map +0 -1
  287. package/dist/core/deployments.d.ts.map +0 -1
  288. package/dist/core/deployments.js.map +0 -1
  289. package/dist/core/movementProfile.d.ts.map +0 -1
  290. package/dist/core/movementProfile.js.map +0 -1
  291. package/dist/core/shell.d.ts.map +0 -1
  292. package/dist/core/shell.js.map +0 -1
  293. package/dist/errors.d.ts.map +0 -1
  294. package/dist/errors.js.map +0 -1
  295. package/dist/fork/__tests__/manager.test.d.ts +0 -2
  296. package/dist/fork/__tests__/manager.test.d.ts.map +0 -1
  297. package/dist/fork/__tests__/manager.test.js +0 -309
  298. package/dist/fork/__tests__/manager.test.js.map +0 -1
  299. package/dist/fork/__tests__/server.cors.test.d.ts +0 -2
  300. package/dist/fork/__tests__/server.cors.test.d.ts.map +0 -1
  301. package/dist/fork/__tests__/server.cors.test.js +0 -79
  302. package/dist/fork/__tests__/server.cors.test.js.map +0 -1
  303. package/dist/fork/__tests__/server.test.d.ts +0 -2
  304. package/dist/fork/__tests__/server.test.d.ts.map +0 -1
  305. package/dist/fork/__tests__/server.test.js +0 -54
  306. package/dist/fork/__tests__/server.test.js.map +0 -1
  307. package/dist/fork/__tests__/storage.test.d.ts +0 -2
  308. package/dist/fork/__tests__/storage.test.d.ts.map +0 -1
  309. package/dist/fork/__tests__/storage.test.js +0 -222
  310. package/dist/fork/__tests__/storage.test.js.map +0 -1
  311. package/dist/fork/__tests__/test.test.d.ts +0 -2
  312. package/dist/fork/__tests__/test.test.d.ts.map +0 -1
  313. package/dist/fork/__tests__/test.test.js +0 -81
  314. package/dist/fork/__tests__/test.test.js.map +0 -1
  315. package/dist/fork/api.d.ts.map +0 -1
  316. package/dist/fork/api.js.map +0 -1
  317. package/dist/fork/manager.d.ts.map +0 -1
  318. package/dist/fork/manager.js.map +0 -1
  319. package/dist/fork/server.d.ts.map +0 -1
  320. package/dist/fork/server.js.map +0 -1
  321. package/dist/fork/storage.d.ts.map +0 -1
  322. package/dist/fork/storage.js.map +0 -1
  323. package/dist/fork/test.d.ts.map +0 -1
  324. package/dist/fork/test.js.map +0 -1
  325. package/dist/harness/Harness.d.ts.map +0 -1
  326. package/dist/harness/Harness.js.map +0 -1
  327. package/dist/harness/codeObject.d.ts.map +0 -1
  328. package/dist/harness/codeObject.js.map +0 -1
  329. package/dist/harness/errors.d.ts.map +0 -1
  330. package/dist/harness/errors.js.map +0 -1
  331. package/dist/harness/index.d.ts.map +0 -1
  332. package/dist/harness/index.js.map +0 -1
  333. package/dist/harness/proxy.d.ts.map +0 -1
  334. package/dist/harness/proxy.js.map +0 -1
  335. package/dist/harness/script.d.ts.map +0 -1
  336. package/dist/harness/script.js.map +0 -1
  337. package/dist/harness/view.d.ts.map +0 -1
  338. package/dist/harness/view.js.map +0 -1
  339. package/dist/helpers/__tests__/semver-utils.test.d.ts +0 -2
  340. package/dist/helpers/__tests__/semver-utils.test.d.ts.map +0 -1
  341. package/dist/helpers/__tests__/semver-utils.test.js +0 -103
  342. package/dist/helpers/__tests__/semver-utils.test.js.map +0 -1
  343. package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.d.ts +0 -2
  344. package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.d.ts.map +0 -1
  345. package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.js +0 -172
  346. package/dist/helpers/__tests__/setupLocalTesting.fork-network.test.js.map +0 -1
  347. package/dist/helpers/assertions.d.ts.map +0 -1
  348. package/dist/helpers/assertions.js.map +0 -1
  349. package/dist/helpers/banner.d.ts.map +0 -1
  350. package/dist/helpers/banner.js.map +0 -1
  351. package/dist/helpers/index.d.ts.map +0 -1
  352. package/dist/helpers/index.js.map +0 -1
  353. package/dist/helpers/move-tests.d.ts.map +0 -1
  354. package/dist/helpers/move-tests.js.map +0 -1
  355. package/dist/helpers/npm-registry.d.ts.map +0 -1
  356. package/dist/helpers/npm-registry.js.map +0 -1
  357. package/dist/helpers/semver-utils.d.ts.map +0 -1
  358. package/dist/helpers/semver-utils.js.map +0 -1
  359. package/dist/helpers/setup.d.ts.map +0 -1
  360. package/dist/helpers/setup.js.map +0 -1
  361. package/dist/helpers/setupLocalTesting.d.ts.map +0 -1
  362. package/dist/helpers/setupLocalTesting.js.map +0 -1
  363. package/dist/helpers/testFixtures.d.ts.map +0 -1
  364. package/dist/helpers/testFixtures.js.map +0 -1
  365. package/dist/helpers/version-check.d.ts.map +0 -1
  366. package/dist/helpers/version-check.js.map +0 -1
  367. package/dist/index.d.ts.map +0 -1
  368. package/dist/index.js.map +0 -1
  369. package/dist/node/LocalNodeManager.d.ts.map +0 -1
  370. package/dist/node/LocalNodeManager.js.map +0 -1
  371. package/dist/node/__tests__/LocalNodeManager.api-port.test.d.ts +0 -2
  372. package/dist/node/__tests__/LocalNodeManager.api-port.test.d.ts.map +0 -1
  373. package/dist/node/__tests__/LocalNodeManager.api-port.test.js +0 -55
  374. package/dist/node/__tests__/LocalNodeManager.api-port.test.js.map +0 -1
  375. package/dist/node/__tests__/LocalNodeManager.test.d.ts +0 -2
  376. package/dist/node/__tests__/LocalNodeManager.test.d.ts.map +0 -1
  377. package/dist/node/__tests__/LocalNodeManager.test.js +0 -449
  378. package/dist/node/__tests__/LocalNodeManager.test.js.map +0 -1
  379. package/dist/runtime.d.ts.map +0 -1
  380. package/dist/runtime.js.map +0 -1
  381. package/dist/types/config.d.ts.map +0 -1
  382. package/dist/types/config.js.map +0 -1
  383. package/dist/types/fork.d.ts.map +0 -1
  384. package/dist/types/fork.js.map +0 -1
  385. package/dist/types/harness.d.ts.map +0 -1
  386. package/dist/types/harness.js.map +0 -1
  387. package/dist/types/runtime.d.ts.map +0 -1
  388. package/dist/types/runtime.js.map +0 -1
  389. package/dist/ui/__tests__/colors.test.d.ts +0 -2
  390. package/dist/ui/__tests__/colors.test.d.ts.map +0 -1
  391. package/dist/ui/__tests__/colors.test.js +0 -127
  392. package/dist/ui/__tests__/colors.test.js.map +0 -1
  393. package/dist/ui/__tests__/logger.test.d.ts +0 -2
  394. package/dist/ui/__tests__/logger.test.d.ts.map +0 -1
  395. package/dist/ui/__tests__/logger.test.js +0 -75
  396. package/dist/ui/__tests__/logger.test.js.map +0 -1
  397. package/dist/ui/colors.d.ts.map +0 -1
  398. package/dist/ui/colors.js.map +0 -1
  399. package/dist/ui/formatters.d.ts.map +0 -1
  400. package/dist/ui/formatters.js.map +0 -1
  401. package/dist/ui/index.d.ts.map +0 -1
  402. package/dist/ui/index.js.map +0 -1
  403. package/dist/ui/logger.d.ts.map +0 -1
  404. package/dist/ui/logger.js.map +0 -1
  405. package/dist/ui/spinner.d.ts.map +0 -1
  406. package/dist/ui/spinner.js.map +0 -1
  407. package/dist/ui/symbols.d.ts.map +0 -1
  408. package/dist/ui/symbols.js.map +0 -1
  409. package/dist/ui/table.d.ts.map +0 -1
  410. package/dist/ui/table.js.map +0 -1
  411. package/dist/utils/__tests__/address.test.d.ts +0 -2
  412. package/dist/utils/__tests__/address.test.d.ts.map +0 -1
  413. package/dist/utils/__tests__/address.test.js +0 -70
  414. package/dist/utils/__tests__/address.test.js.map +0 -1
  415. package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.d.ts +0 -2
  416. package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.d.ts.map +0 -1
  417. package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.js +0 -43
  418. package/dist/utils/__tests__/childProcessAdapter.maxBuffer.test.js.map +0 -1
  419. package/dist/utils/__tests__/childProcessAdapter.test.d.ts +0 -2
  420. package/dist/utils/__tests__/childProcessAdapter.test.d.ts.map +0 -1
  421. package/dist/utils/__tests__/childProcessAdapter.test.js +0 -217
  422. package/dist/utils/__tests__/childProcessAdapter.test.js.map +0 -1
  423. package/dist/utils/__tests__/runCli.test.d.ts +0 -2
  424. package/dist/utils/__tests__/runCli.test.d.ts.map +0 -1
  425. package/dist/utils/__tests__/runCli.test.js +0 -187
  426. package/dist/utils/__tests__/runCli.test.js.map +0 -1
  427. package/dist/utils/address.d.ts.map +0 -1
  428. package/dist/utils/address.js.map +0 -1
  429. package/dist/utils/childProcessAdapter.d.ts.map +0 -1
  430. package/dist/utils/childProcessAdapter.js.map +0 -1
  431. package/dist/utils/parseCliOutput.d.ts.map +0 -1
  432. package/dist/utils/parseCliOutput.js.map +0 -1
  433. package/dist/utils/redact.d.ts.map +0 -1
  434. package/dist/utils/redact.js.map +0 -1
  435. package/dist/utils/runCli.d.ts.map +0 -1
  436. package/dist/utils/runCli.js.map +0 -1
  437. package/src/__tests__/deployContract.test.ts +0 -438
  438. package/src/__tests__/errors.test.ts +0 -84
  439. package/src/__tests__/exports.test.ts +0 -32
  440. package/src/__tests__/fixtures/sigint-deploy-harness.ts +0 -96
  441. package/src/__tests__/fork/api.test.ts +0 -148
  442. package/src/__tests__/fork/api.timeout.test.ts +0 -150
  443. package/src/__tests__/harness/Harness.createLive.test.ts +0 -57
  444. package/src/__tests__/harness/Harness.proxy.test.ts +0 -111
  445. package/src/__tests__/harness/_fixture.ts +0 -131
  446. package/src/__tests__/harness/codeObject.deploy.test.ts +0 -319
  447. package/src/__tests__/harness/codeObject.upgrade.test.ts +0 -156
  448. package/src/__tests__/harness/script.test.ts +0 -245
  449. package/src/__tests__/harness/view.test.ts +0 -104
  450. package/src/__tests__/runtime.test.ts +0 -182
  451. package/src/cli.ts +0 -164
  452. package/src/commands/__tests__/compile.test.ts +0 -407
  453. package/src/commands/__tests__/compile.toml-mutation.test.ts +0 -77
  454. package/src/commands/__tests__/init.test.ts +0 -210
  455. package/src/commands/__tests__/run.test.ts +0 -192
  456. package/src/commands/__tests__/test-move.test.ts +0 -81
  457. package/src/commands/__tests__/test.test.ts +0 -204
  458. package/src/commands/__tests__/update.test.ts +0 -223
  459. package/src/commands/compile.ts +0 -339
  460. package/src/commands/fork/__tests__/create.test.ts +0 -132
  461. package/src/commands/fork/__tests__/fund.test.ts +0 -104
  462. package/src/commands/fork/__tests__/list.test.ts +0 -139
  463. package/src/commands/fork/__tests__/serve.test.ts +0 -121
  464. package/src/commands/fork/__tests__/view-resource.test.ts +0 -101
  465. package/src/commands/fork/create.ts +0 -110
  466. package/src/commands/fork/fund.ts +0 -64
  467. package/src/commands/fork/list.ts +0 -98
  468. package/src/commands/fork/serve.ts +0 -80
  469. package/src/commands/fork/view-resource.ts +0 -51
  470. package/src/commands/init.ts +0 -264
  471. package/src/commands/run.ts +0 -125
  472. package/src/commands/test-move.ts +0 -27
  473. package/src/commands/test.ts +0 -255
  474. package/src/commands/update.ts +0 -201
  475. package/src/core/AccountManager.ts +0 -457
  476. package/src/core/Publisher.ts +0 -310
  477. package/src/core/__tests__/AccountManager.global-state.test.ts +0 -83
  478. package/src/core/__tests__/AccountManager.test.ts +0 -290
  479. package/src/core/__tests__/config.test.ts +0 -377
  480. package/src/core/__tests__/deployments.test.ts +0 -247
  481. package/src/core/__tests__/movementProfile.test.ts +0 -131
  482. package/src/core/__tests__/shell.test.ts +0 -138
  483. package/src/core/config.ts +0 -286
  484. package/src/core/contract.ts +0 -103
  485. package/src/core/deployments.ts +0 -155
  486. package/src/core/movementProfile.ts +0 -127
  487. package/src/core/shell.ts +0 -86
  488. package/src/errors.ts +0 -81
  489. package/src/fork/__tests__/manager.test.ts +0 -385
  490. package/src/fork/__tests__/server.cors.test.ts +0 -101
  491. package/src/fork/__tests__/server.test.ts +0 -65
  492. package/src/fork/__tests__/storage.test.ts +0 -281
  493. package/src/fork/__tests__/test.test.ts +0 -97
  494. package/src/fork/api.ts +0 -190
  495. package/src/fork/manager.ts +0 -343
  496. package/src/fork/server.ts +0 -380
  497. package/src/fork/storage.ts +0 -253
  498. package/src/fork/test.ts +0 -221
  499. package/src/harness/Harness.ts +0 -231
  500. package/src/harness/codeObject.ts +0 -381
  501. package/src/harness/errors.ts +0 -22
  502. package/src/harness/index.ts +0 -3
  503. package/src/harness/proxy.ts +0 -40
  504. package/src/harness/script.ts +0 -200
  505. package/src/harness/view.ts +0 -34
  506. package/src/helpers/__tests__/semver-utils.test.ts +0 -121
  507. package/src/helpers/__tests__/setupLocalTesting.fork-network.test.ts +0 -212
  508. package/src/helpers/assertions.ts +0 -29
  509. package/src/helpers/banner.ts +0 -63
  510. package/src/helpers/index.ts +0 -37
  511. package/src/helpers/move-tests.ts +0 -72
  512. package/src/helpers/npm-registry.ts +0 -72
  513. package/src/helpers/semver-utils.ts +0 -54
  514. package/src/helpers/setup.ts +0 -54
  515. package/src/helpers/setupLocalTesting.ts +0 -387
  516. package/src/helpers/testFixtures.ts +0 -210
  517. package/src/helpers/version-check.ts +0 -114
  518. package/src/index.ts +0 -30
  519. package/src/node/LocalNodeManager.ts +0 -383
  520. package/src/node/__tests__/LocalNodeManager.api-port.test.ts +0 -62
  521. package/src/node/__tests__/LocalNodeManager.test.ts +0 -579
  522. package/src/runtime.ts +0 -157
  523. package/src/templates/.env.example +0 -9
  524. package/src/templates/.mocharc.json +0 -8
  525. package/src/templates/.vscode/settings.json +0 -11
  526. package/src/templates/README.md +0 -146
  527. package/src/templates/gitignore +0 -22
  528. package/src/templates/move/Move.toml +0 -19
  529. package/src/templates/move/sources/Counter.move +0 -96
  530. package/src/templates/movehat.config.ts +0 -57
  531. package/src/templates/package.json +0 -27
  532. package/src/templates/scripts/deploy-counter.ts +0 -66
  533. package/src/templates/tests/Counter.test.ts +0 -113
  534. package/src/templates/tsconfig.json +0 -15
  535. package/src/templates/types/movehat.d.ts +0 -101
  536. package/src/types/config.ts +0 -83
  537. package/src/types/fork.ts +0 -47
  538. package/src/types/harness.ts +0 -182
  539. package/src/types/runtime.ts +0 -57
  540. package/src/ui/__tests__/colors.test.ts +0 -156
  541. package/src/ui/__tests__/logger.test.ts +0 -89
  542. package/src/ui/colors.ts +0 -144
  543. package/src/ui/formatters.ts +0 -246
  544. package/src/ui/index.ts +0 -62
  545. package/src/ui/logger.ts +0 -310
  546. package/src/ui/spinner.ts +0 -218
  547. package/src/ui/symbols.ts +0 -80
  548. package/src/ui/table.ts +0 -191
  549. package/src/utils/__tests__/address.test.ts +0 -93
  550. package/src/utils/__tests__/childProcessAdapter.maxBuffer.test.ts +0 -51
  551. package/src/utils/__tests__/childProcessAdapter.test.ts +0 -266
  552. package/src/utils/__tests__/runCli.test.ts +0 -240
  553. package/src/utils/address.ts +0 -52
  554. package/src/utils/childProcessAdapter.ts +0 -244
  555. package/src/utils/parseCliOutput.ts +0 -27
  556. package/src/utils/redact.ts +0 -24
  557. package/src/utils/runCli.ts +0 -64
@@ -1,310 +0,0 @@
1
- import { Account, PrivateKey, PrivateKeyVariants } from "@aptos-labs/ts-sdk";
2
- import { MovehatConfig } from "../types/config.js";
3
- import { extractNamedAddresses } from "../commands/compile.js";
4
- import {
5
- saveDeployment,
6
- loadDeployment,
7
- DeploymentInfo,
8
- validateSafeName,
9
- } from "./deployments.js";
10
- import { validatePathSafety } from "./shell.js";
11
- import { CliExecutionError, ModuleAlreadyDeployedError, PostPublishError } from "../errors.js";
12
- import { runCli } from "../utils/runCli.js";
13
- import { logger, isVerbose } from "../ui/index.js";
14
- import { withSpinner } from "../ui/spinner.js";
15
- import type { ChildProcessAdapter } from "../utils/childProcessAdapter.js";
16
- import {
17
- writeTempKeyFile,
18
- removeKeyFile,
19
- removeKeyFileSyncBestEffort,
20
- ensureSignalHandler,
21
- cleanupCallbacks,
22
- } from "./movementProfile.js";
23
- import { parseTxHash } from "../utils/parseCliOutput.js";
24
-
25
- /** @internal */
26
- export interface PublisherDeps {
27
- adapter?: ChildProcessAdapter | undefined;
28
- }
29
-
30
- /** @internal */
31
- export interface PublishInput {
32
- moduleName: string;
33
- config: MovehatConfig;
34
- account: Account;
35
- packageDir?: string | undefined;
36
- }
37
-
38
- /**
39
- * Publishes a Move module via the Movement CLI.
40
- *
41
- * @internal
42
- */
43
- export class Publisher {
44
- constructor(private readonly deps: PublisherDeps = {}) {}
45
-
46
- async deploy(input: PublishInput): Promise<DeploymentInfo> {
47
- const { moduleName, config, account } = input;
48
-
49
- validateSafeName(moduleName, "module");
50
-
51
- const forceRedeploy = process.env.MH_CLI_REDEPLOY === "true";
52
-
53
- const existingDeployment = loadDeployment(config.network, moduleName);
54
- if (existingDeployment && !forceRedeploy) {
55
- // Build detailed error message with all deployment info
56
- const errorDetails = [
57
- `Module "${moduleName}" is already deployed on ${config.network}`,
58
- `Address: ${existingDeployment.address}`,
59
- `Deployed at: ${new Date(existingDeployment.timestamp).toLocaleString()}`,
60
- existingDeployment.txHash ? `Transaction: ${existingDeployment.txHash}` : null,
61
- `\nTo redeploy, run with the --redeploy flag:`,
62
- `movehat run <script> --network ${config.network} --redeploy`,
63
- ]
64
- .filter(Boolean)
65
- .join("\n");
66
-
67
- // Log formatted error message for user
68
- logger.error(`Module "${moduleName}" is already deployed on ${config.network}`);
69
- logger.plain(` Address: ${existingDeployment.address}`);
70
- logger.plain(
71
- ` Deployed at: ${new Date(existingDeployment.timestamp).toLocaleString()}`
72
- );
73
- if (existingDeployment.txHash) {
74
- logger.plain(` Transaction: ${existingDeployment.txHash}`);
75
- }
76
- logger.newline();
77
- logger.info("To redeploy, run with the --redeploy flag:");
78
- logger.plain(` movehat run <script> --network ${config.network} --redeploy`);
79
- logger.newline();
80
-
81
- // Throw custom error with complete context for programmatic handling
82
- throw new ModuleAlreadyDeployedError(
83
- errorDetails,
84
- moduleName,
85
- config.network,
86
- existingDeployment.address,
87
- existingDeployment.timestamp,
88
- existingDeployment.txHash
89
- );
90
- }
91
-
92
- if (forceRedeploy && existingDeployment) {
93
- logger.info(`Redeploying module "${moduleName}" on ${config.network}...`);
94
- }
95
-
96
- const dir = input.packageDir || config.moveDir;
97
-
98
- // Validate (no shell escape — runCli uses spawn, which takes args
99
- // verbatim and would treat the single-quote wrapping as part of the
100
- // literal path, breaking Movement CLI argument parsing).
101
- const safeDir = validatePathSafety(dir, "package directory");
102
-
103
- logger.step(`Publishing module "${moduleName}" from ${dir}...`);
104
-
105
- try {
106
- // Get the deployer address to use for named addresses
107
- const deployerAddress = account.accountAddress.toString();
108
-
109
- // Detect named addresses from Move files
110
- const detectedAddresses = extractNamedAddresses(dir);
111
-
112
- // Build named addresses argument - use deployer address for all detected addresses.
113
- // Stored as a pre-split args fragment so the spawn path never has to parse
114
- // shell tokens; an empty fragment becomes a no-op via spread.
115
- const namedAddrArgs: string[] =
116
- detectedAddresses.size > 0
117
- ? [
118
- "--named-addresses",
119
- Array.from(detectedAddresses)
120
- .map((name) => `${name}=${deployerAddress}`)
121
- .join(","),
122
- ]
123
- : [];
124
-
125
- // Build first with named addresses
126
- const buildResult = await withSpinner(
127
- "Building package",
128
- () =>
129
- runCli(
130
- {
131
- command: "movement",
132
- args: ["move", "build", "--package-dir", safeDir, ...namedAddrArgs],
133
- timeoutMs: 120000, // 2 minutes for git dependency downloads
134
- },
135
- { adapter: this.deps.adapter }
136
- ),
137
- );
138
- if (isVerbose() && buildResult.stdout) {
139
- logger.info(buildResult.stdout.trim(), 2);
140
- }
141
-
142
- // Publish using direct parameters (avoid config file issues)
143
-
144
- // Format the private key into AIP-80 shape so the Movement CLI
145
- // doesn't emit its raw-hex deprecation warning. `formatPrivateKey`
146
- // is idempotent for already-prefixed inputs.
147
- const formattedPrivateKey = PrivateKey.formatPrivateKey(
148
- config.privateKey,
149
- PrivateKeyVariants.Ed25519,
150
- );
151
-
152
- // Move.toml is NOT mutated. All address overrides flow through
153
- // the `--named-addresses` flag above, which Movement CLI applies
154
- // during build + publish. Rewriting Move.toml on disk would risk
155
- // leaving the user's file mutated if the process died before the
156
- // restore step.
157
-
158
- let publishOut = "";
159
- let publishErr = "";
160
-
161
- // Pass the private key to Movement CLI via a 0o600 temp file
162
- // (`--private-key-file <path>`) and the on-chain address via
163
- // `--sender-account <addr>`. This avoids the CLI's profile-yaml
164
- // lookup chain entirely — no CWD / HOME / .aptos / .movement
165
- // dance, no CLI-variant dependency.
166
- const keyFilePath = writeTempKeyFile(formattedPrivateKey);
167
-
168
- // Register a sync cleanup hook BEFORE invoking the CLI. If the
169
- // user Ctrl+C's (or the process is SIGTERM'd) between the file
170
- // write and our finally, the SIGINT handler iterates every
171
- // registered callback and unlinks this deploy's key file
172
- // synchronously so the private key never persists on disk after
173
- // an abnormal exit. The signal-handler path uses the
174
- // best-effort variant because the event loop is dead and we
175
- // cannot logger.warning.
176
- ensureSignalHandler();
177
- const syncCleanup = () => removeKeyFileSyncBestEffort(keyFilePath);
178
- cleanupCallbacks.add(syncCleanup);
179
-
180
- try {
181
- // Execute publish command. Private key reaches the CLI via the
182
- // temp key file path (--private-key-file) — never on the
183
- // command line — so it can't leak through `ps aux`. runCli's
184
- // stdout/stderr redaction still applies as defense in depth
185
- // for any `ed25519-priv-…` substring that surfaces in CLI
186
- // output (Movement CLI sometimes echoes the key on error).
187
- const publishResult = await withSpinner(
188
- "Publishing to blockchain",
189
- () =>
190
- runCli(
191
- {
192
- command: "movement",
193
- args: [
194
- "move",
195
- "publish",
196
- "--package-dir",
197
- safeDir,
198
- "--url",
199
- config.rpc,
200
- "--private-key-file",
201
- keyFilePath,
202
- "--sender-account",
203
- deployerAddress,
204
- "--assume-yes",
205
- ...namedAddrArgs,
206
- ],
207
- timeoutMs: 120000, // 2 minutes for blockchain transactions
208
- },
209
- { adapter: this.deps.adapter }
210
- ),
211
- );
212
- publishOut = publishResult.stdout;
213
- publishErr = publishResult.stderr;
214
- // Both stdout and stderr from the publish subprocess are gated
215
- // behind isVerbose() — Movement CLI emits progress to both
216
- // streams ("Compiling, may take a little while..."), so a
217
- // visible stderr line is not by itself a failure signal. The
218
- // surrounding withSpinner converts the runCli throw on real
219
- // failure into the visible spinner.fail() output instead.
220
- if (isVerbose() && publishOut) logger.info(publishOut.trim(), 2);
221
- if (isVerbose() && publishErr) logger.info(publishErr.trim(), 2);
222
- } finally {
223
- // Unlink the temp key file via the observable cleanup helper.
224
- // ENOENT and other already-gone outcomes are benign (null).
225
- // A non-null Error means the unlink failed AND the file still
226
- // exists on disk — the private key would persist silently
227
- // otherwise, so we emit a warning with the manual-cleanup
228
- // hint. The SIGINT signal handler's sync callback below also
229
- // tries to remove the same file; if SIGINT fires before this
230
- // finally runs the file is gone and the next finally call
231
- // sees ENOENT (benign).
232
- const cleanupErr = removeKeyFile(keyFilePath);
233
- if (cleanupErr) {
234
- logger.warning(
235
- `Failed to remove temp key file '${keyFilePath}': ${cleanupErr.message}. ` +
236
- `The file has mode 0o600 but should be removed manually: rm ${keyFilePath}`
237
- );
238
- }
239
- cleanupCallbacks.delete(syncCleanup);
240
- }
241
-
242
- // Extract transaction hash from output via the shared helper
243
- // (`utils/parseCliOutput.ts`). Same regex pair as before; lifted
244
- // for reuse by harness/codeObject.ts and harness/script.ts.
245
- const txHash = parseTxHash(publishOut);
246
-
247
- logger.success("Module published successfully!");
248
-
249
- // ←← "Publish succeeded" boundary. Anything thrown below this
250
- // point did NOT cause the publish to fail — the module is on
251
- // chain. We surface those failures as PostPublishError so callers
252
- // can distinguish a genuine publish failure from a local
253
- // bookkeeping failure (and avoid a wasteful redeploy).
254
-
255
- const deployment: DeploymentInfo = {
256
- address: account.accountAddress.toString(),
257
- moduleName,
258
- network: config.network,
259
- deployer: account.accountAddress.toString(),
260
- timestamp: Date.now(),
261
- txHash,
262
- };
263
-
264
- try {
265
- saveDeployment(deployment);
266
- } catch (error) {
267
- const err = error instanceof Error ? error : new Error(String(error));
268
- throw new PostPublishError(
269
- `Module "${moduleName}" published to ${deployment.address} ` +
270
- `but local deployment record could not be written: ${err.message}`,
271
- deployment,
272
- err
273
- );
274
- }
275
-
276
- return deployment;
277
- } catch (error) {
278
- if (error instanceof PostPublishError) {
279
- // Publish DID succeed; only local persistence failed. Log as
280
- // warning (not error) so the user knows the deploy is real on
281
- // chain. Re-throw so programmatic callers can react.
282
- logger.warning(
283
- `Module published successfully to ${error.deployment.address} ` +
284
- `(tx=${error.deployment.txHash ?? "unknown"}) ` +
285
- `but local deployment record could not be written.`
286
- );
287
- logger.warning(` Cause: ${error.cause.message}`);
288
- logger.warning(
289
- ` To recover, manually write the deployment to ` +
290
- `deployments/${error.deployment.network}/${error.deployment.moduleName}.json.`
291
- );
292
- throw error;
293
- }
294
- if (error instanceof CliExecutionError) {
295
- // stdout/stderr are already redacted by runCli before reaching here,
296
- // so this branch is safe to log verbatim.
297
- if (error.stdoutPreview) logger.info(error.stdoutPreview, 2);
298
- logger.error(`Failed to publish module: ${error.message}\n${error.stderr}`);
299
- } else {
300
- // Preserve existing behaviour for non-CLI errors (filesystem write
301
- // failures from Move.toml / ~/.aptos/config.yaml, yaml parse errors,
302
- // etc.). These paths can't carry private-key material so logging raw
303
- // is safe.
304
- const err = error instanceof Error ? error : new Error(String(error));
305
- logger.error(`Failed to publish module: ${err.message}`);
306
- }
307
- throw error;
308
- }
309
- }
310
- }
@@ -1,83 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
- import { existsSync, mkdtempSync, rmSync } from "node:fs";
3
- import { tmpdir } from "node:os";
4
- import { join } from "node:path";
5
-
6
- import { AccountManager } from "../AccountManager.js";
7
-
8
- /**
9
- * F8 — Document the two known limitations of `AccountManager`:
10
- *
11
- * (a) State is class-static. Two harness "sessions" in the same
12
- * process share the pool, the labelMap, and the private-key
13
- * map. A label re-used across sessions overwrites the entry.
14
- * This is intentional per `Harness.ts:39-42` ("Two Harness
15
- * instances in the same process share account labels"). This
16
- * test captures the contract so a future refactor cannot
17
- * silently change it.
18
- *
19
- * (b) `defaultPoolPath = join(process.cwd(), ".movehat", "accounts")`
20
- * is evaluated when the module is first imported, NOT lazily on
21
- * each call. Changing `process.cwd()` after import does not move
22
- * the save destination. Callers needing per-test isolation must
23
- * pass an explicit `poolPath` argument.
24
- */
25
-
26
- describe("F8 — AccountManager static state and import-time cwd capture", () => {
27
- let cwdBackup: string;
28
- let tmpDir: string;
29
-
30
- beforeEach(() => {
31
- AccountManager.clearPool();
32
- cwdBackup = process.cwd();
33
- tmpDir = mkdtempSync(join(tmpdir(), "movehat-f8-"));
34
- });
35
-
36
- afterEach(() => {
37
- AccountManager.clearPool();
38
- if (process.cwd() !== cwdBackup) {
39
- process.chdir(cwdBackup);
40
- }
41
- rmSync(tmpDir, { recursive: true, force: true });
42
- });
43
-
44
- it("(a) re-creating an account with an existing label overwrites the labelMap entry", () => {
45
- const first = AccountManager.createAccount("alice");
46
- const second = AccountManager.createAccount("alice");
47
- expect(second.accountAddress.toString()).not.toBe(
48
- first.accountAddress.toString()
49
- );
50
-
51
- const lookup = AccountManager.getAccountByLabel("alice");
52
- expect(lookup).toBeDefined();
53
- expect(lookup!.accountAddress.toString()).toBe(
54
- second.accountAddress.toString()
55
- );
56
- // The first account is still in the pool (keyed by address), only
57
- // the label binding moved. A second harness session that creates
58
- // its own "alice" will silently shadow the first — this is the
59
- // documented Harness limitation. exportPrivateKeys reflects the
60
- // current label binding (i.e. the second account).
61
- const exportedKeys = AccountManager.exportPrivateKeys(["alice"]);
62
- expect(exportedKeys.alice).toBeTypeOf("string");
63
- expect(exportedKeys.alice!.length).toBeGreaterThan(0);
64
- });
65
-
66
- it("(b) saveAccountPool ignores a process.chdir after import; defaults to the import-time cwd", () => {
67
- AccountManager.createAccount("bob");
68
-
69
- process.chdir(tmpDir);
70
- // No path argument → uses defaultPoolPath, which was set at module
71
- // load time before this chdir.
72
- AccountManager.saveAccountPool();
73
-
74
- // The pool file must NOT appear under the freshly-chdir'd cwd.
75
- const expectedAtNewCwd = join(tmpDir, ".movehat", "accounts", "test-pool.json");
76
- expect(existsSync(expectedAtNewCwd)).toBe(false);
77
-
78
- // Sanity check: explicit poolPath does land where the caller asked.
79
- const explicit = join(tmpDir, "explicit");
80
- AccountManager.saveAccountPool(explicit);
81
- expect(existsSync(join(explicit, "test-pool.json"))).toBe(true);
82
- });
83
- });
@@ -1,290 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- import { mkdtempSync, rmSync, statSync, existsSync, writeFileSync } from "fs";
3
- import { tmpdir, platform } from "os";
4
- import { join } from "path";
5
- import { AccountManager } from "../AccountManager.js";
6
- import type { MovehatConfig } from "../../types/config.js";
7
-
8
- describe("AccountManager.saveAccountPool", () => {
9
- let tmpDir: string;
10
-
11
- beforeEach(() => {
12
- tmpDir = mkdtempSync(join(tmpdir(), "movehat-acc-pool-"));
13
- AccountManager.clearPool();
14
- });
15
-
16
- afterEach(() => {
17
- AccountManager.clearPool();
18
- if (existsSync(tmpDir)) {
19
- rmSync(tmpDir, { recursive: true, force: true });
20
- }
21
- });
22
-
23
- it("writes test-pool.json with 0o600 permissions", () => {
24
- AccountManager.createAccount("alice");
25
- AccountManager.createAccount("bob");
26
-
27
- const poolDir = join(tmpDir, "accounts");
28
- AccountManager.saveAccountPool(poolDir);
29
-
30
- const poolFile = join(poolDir, "test-pool.json");
31
- expect(existsSync(poolFile)).toBe(true);
32
-
33
- // Mode check is POSIX-only; skip on Windows where mode bits don't apply.
34
- if (platform() !== "win32") {
35
- const stat = statSync(poolFile);
36
- const mode = stat.mode & 0o777;
37
- expect(mode).toBe(0o600);
38
- }
39
- });
40
-
41
- it("creates the pool directory with 0o700 permissions when missing", () => {
42
- AccountManager.createAccount("alice");
43
-
44
- const poolDir = join(tmpDir, "fresh-accounts");
45
- AccountManager.saveAccountPool(poolDir);
46
-
47
- expect(existsSync(poolDir)).toBe(true);
48
-
49
- if (platform() !== "win32") {
50
- const stat = statSync(poolDir);
51
- const mode = stat.mode & 0o777;
52
- expect(mode).toBe(0o700);
53
- }
54
- });
55
- });
56
-
57
- const TEST_KEY_A =
58
- "0x0000000000000000000000000000000000000000000000000000000000000001";
59
- const TEST_KEY_B =
60
- "0x0000000000000000000000000000000000000000000000000000000000000002";
61
-
62
- describe("AccountManager — create / lookup / label", () => {
63
- beforeEach(() => {
64
- AccountManager.clearPool();
65
- });
66
-
67
- afterEach(() => {
68
- AccountManager.clearPool();
69
- });
70
-
71
- it("getTestAccount(label) creates on first call, returns the same on second", () => {
72
- const first = AccountManager.getTestAccount("alice");
73
- const second = AccountManager.getTestAccount("alice");
74
- expect(second.accountAddress.toString()).toBe(first.accountAddress.toString());
75
- });
76
-
77
- it("getTestAccount() with no label creates a fresh unlabeled account", () => {
78
- const a = AccountManager.getTestAccount();
79
- const b = AccountManager.getTestAccount();
80
- expect(a.accountAddress.toString()).not.toBe(b.accountAddress.toString());
81
- });
82
-
83
- it("createAccount tracks the new account in the pool", () => {
84
- expect(AccountManager.getPoolSize()).toBe(0);
85
- AccountManager.createAccount("alice");
86
- AccountManager.createAccount("bob");
87
- expect(AccountManager.getPoolSize()).toBe(2);
88
- });
89
-
90
- it("getAccountByLabel returns undefined for an unknown label", () => {
91
- expect(AccountManager.getAccountByLabel("missing")).toBeUndefined();
92
- });
93
-
94
- it("getLabeledAccounts returns a map of every labeled account", () => {
95
- AccountManager.createAccount("alice");
96
- AccountManager.createAccount("bob");
97
- AccountManager.createAccount(); // unlabeled — should NOT appear
98
- const labeled = AccountManager.getLabeledAccounts();
99
- expect(Object.keys(labeled).sort()).toEqual(["alice", "bob"]);
100
- });
101
-
102
- it("hasLabel reflects the label map state", () => {
103
- expect(AccountManager.hasLabel("alice")).toBe(false);
104
- AccountManager.createAccount("alice");
105
- expect(AccountManager.hasLabel("alice")).toBe(true);
106
- });
107
-
108
- it("getOrCreateLabeled returns the existing labeled account on second call", () => {
109
- const first = AccountManager.getOrCreateLabeled("alice");
110
- const second = AccountManager.getOrCreateLabeled("alice");
111
- expect(second.accountAddress.toString()).toBe(first.accountAddress.toString());
112
- expect(AccountManager.getPoolSize()).toBe(1);
113
- });
114
-
115
- it("createBatch creates one account per label and returns the map", () => {
116
- const accounts = AccountManager.createBatch(["alice", "bob", "charlie"]);
117
- expect(Object.keys(accounts).sort()).toEqual(["alice", "bob", "charlie"]);
118
- expect(AccountManager.getPoolSize()).toBe(3);
119
- });
120
-
121
- it("getAllAccounts returns every account in insertion order", () => {
122
- const a = AccountManager.createAccount("alice");
123
- const b = AccountManager.createAccount("bob");
124
- const addrs = AccountManager.getAllAccounts().map((acc) =>
125
- acc.accountAddress.toString()
126
- );
127
- // Insertion order is preserved by the underlying Map iteration.
128
- expect(addrs).toEqual([
129
- a.accountAddress.toString(),
130
- b.accountAddress.toString(),
131
- ]);
132
- });
133
-
134
- it("clearPool resets pool, label map, and poolLoaded flag", () => {
135
- AccountManager.createAccount("alice");
136
- expect(AccountManager.getPoolSize()).toBe(1);
137
- AccountManager.clearPool();
138
- expect(AccountManager.getPoolSize()).toBe(0);
139
- expect(AccountManager.hasLabel("alice")).toBe(false);
140
- });
141
- });
142
-
143
- describe("AccountManager — load from env / key / config", () => {
144
- let origEnv: string | undefined;
145
-
146
- beforeEach(() => {
147
- AccountManager.clearPool();
148
- origEnv = process.env.PRIVATE_KEY;
149
- delete process.env.PRIVATE_KEY;
150
- });
151
-
152
- afterEach(() => {
153
- AccountManager.clearPool();
154
- if (origEnv === undefined) delete process.env.PRIVATE_KEY;
155
- else process.env.PRIVATE_KEY = origEnv;
156
- });
157
-
158
- it("loadAccountFromEnv reads from PRIVATE_KEY by default", () => {
159
- process.env.PRIVATE_KEY = TEST_KEY_A;
160
- const acc = AccountManager.loadAccountFromEnv();
161
- expect(acc.accountAddress.toString()).toMatch(/^0x[a-f0-9]+$/i);
162
- });
163
-
164
- it("loadAccountFromEnv reads from a custom env var name", () => {
165
- process.env.MY_CUSTOM_KEY = TEST_KEY_A;
166
- try {
167
- const acc = AccountManager.loadAccountFromEnv("MY_CUSTOM_KEY");
168
- expect(acc.accountAddress.toString()).toMatch(/^0x[a-f0-9]+$/i);
169
- } finally {
170
- delete process.env.MY_CUSTOM_KEY;
171
- }
172
- });
173
-
174
- it("loadAccountFromEnv throws when the env var is unset", () => {
175
- expect(() => AccountManager.loadAccountFromEnv("DEFINITELY_NOT_SET")).toThrow(
176
- /not found/
177
- );
178
- });
179
-
180
- it("loadAccountFromPrivateKey adds the account to the pool", () => {
181
- expect(AccountManager.getPoolSize()).toBe(0);
182
- AccountManager.loadAccountFromPrivateKey(TEST_KEY_A);
183
- expect(AccountManager.getPoolSize()).toBe(1);
184
- });
185
-
186
- it("loadAccountsFromConfig loads every valid key", () => {
187
- const config = {
188
- allAccounts: [TEST_KEY_A, TEST_KEY_B],
189
- } as unknown as MovehatConfig;
190
- const accounts = AccountManager.loadAccountsFromConfig(config);
191
- expect(accounts).toHaveLength(2);
192
- });
193
-
194
- it("loadAccountsFromConfig warns on a malformed key and skips it", () => {
195
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => undefined);
196
- const config = {
197
- allAccounts: [TEST_KEY_A, "not-a-real-key"],
198
- } as unknown as MovehatConfig;
199
- const accounts = AccountManager.loadAccountsFromConfig(config);
200
- expect(accounts).toHaveLength(1);
201
- expect(warnSpy).toHaveBeenCalledWith(
202
- expect.stringMatching(/Failed to load account from config/)
203
- );
204
- warnSpy.mockRestore();
205
- });
206
- });
207
-
208
- describe("AccountManager.loadAccountPool / exportPrivateKeys", () => {
209
- let tmpDir: string;
210
-
211
- beforeEach(() => {
212
- tmpDir = mkdtempSync(join(tmpdir(), "movehat-acc-load-"));
213
- AccountManager.clearPool();
214
- });
215
-
216
- afterEach(() => {
217
- AccountManager.clearPool();
218
- if (existsSync(tmpDir)) {
219
- rmSync(tmpDir, { recursive: true, force: true });
220
- }
221
- });
222
-
223
- it("loadAccountPool returns false when the file does not exist", () => {
224
- expect(AccountManager.loadAccountPool(tmpDir)).toBe(false);
225
- });
226
-
227
- it("loadAccountPool restores accounts and labels from disk", () => {
228
- // Plant a pool via save → clear → load round-trip.
229
- AccountManager.createAccount("alice");
230
- AccountManager.createAccount("bob");
231
- const poolDir = join(tmpDir, "accounts");
232
- AccountManager.saveAccountPool(poolDir);
233
- AccountManager.clearPool();
234
- expect(AccountManager.getPoolSize()).toBe(0);
235
-
236
- const ok = AccountManager.loadAccountPool(poolDir);
237
- expect(ok).toBe(true);
238
- expect(AccountManager.getPoolSize()).toBe(2);
239
- expect(AccountManager.hasLabel("alice")).toBe(true);
240
- expect(AccountManager.hasLabel("bob")).toBe(true);
241
- });
242
-
243
- it("loadAccountPool is a no-op when poolLoaded is already true", () => {
244
- AccountManager.createAccount("alice");
245
- const poolDir = join(tmpDir, "accounts");
246
- AccountManager.saveAccountPool(poolDir);
247
- expect(AccountManager.loadAccountPool(poolDir)).toBe(true);
248
- // Second call short-circuits via the poolLoaded flag.
249
- expect(AccountManager.loadAccountPool(poolDir)).toBe(true);
250
- });
251
-
252
- it("loadAccountPool returns false and warns on corrupt JSON", () => {
253
- const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => undefined);
254
- const poolDir = join(tmpDir, "accounts");
255
- // mkdir then write a deliberately malformed test-pool.json.
256
- AccountManager.createAccount("alice");
257
- AccountManager.saveAccountPool(poolDir);
258
- writeFileSync(join(poolDir, "test-pool.json"), "{ not valid json");
259
- AccountManager.clearPool();
260
- expect(AccountManager.loadAccountPool(poolDir)).toBe(false);
261
- expect(warnSpy).toHaveBeenCalledWith(
262
- expect.stringMatching(/Failed to load account pool/)
263
- );
264
- warnSpy.mockRestore();
265
- });
266
-
267
- it("exportPrivateKeys returns every labeled account's key when called with no args", () => {
268
- AccountManager.createAccount("alice");
269
- AccountManager.createAccount("bob");
270
- const exported = AccountManager.exportPrivateKeys();
271
- expect(Object.keys(exported).sort()).toEqual(["alice", "bob"]);
272
- for (const key of Object.values(exported)) {
273
- expect(typeof key).toBe("string");
274
- expect(key.length).toBeGreaterThan(0);
275
- }
276
- });
277
-
278
- it("exportPrivateKeys filters by labels when an array is passed", () => {
279
- AccountManager.createAccount("alice");
280
- AccountManager.createAccount("bob");
281
- AccountManager.createAccount("charlie");
282
- const exported = AccountManager.exportPrivateKeys(["alice", "charlie"]);
283
- expect(Object.keys(exported).sort()).toEqual(["alice", "charlie"]);
284
- });
285
-
286
- it("exportPrivateKeys with an unknown label returns an empty map", () => {
287
- const exported = AccountManager.exportPrivateKeys(["missing"]);
288
- expect(exported).toEqual({});
289
- });
290
- });