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,281 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { vol } from 'memfs';
3
+ import { ForkStorage } from '../storage.js';
4
+
5
+ // Mock fs module
6
+ vi.mock('fs', async () => {
7
+ const memfs = await import('memfs');
8
+ return memfs.fs;
9
+ });
10
+
11
+ describe('ForkStorage', () => {
12
+ const forkPath = '/test-fork';
13
+
14
+ beforeEach(() => {
15
+ vol.reset();
16
+ });
17
+
18
+ afterEach(() => {
19
+ vol.reset();
20
+ });
21
+
22
+ describe('initialize', () => {
23
+ it('should create fork directory structure', () => {
24
+ const storage = new ForkStorage(forkPath);
25
+ storage.initialize();
26
+
27
+ expect(vol.existsSync(forkPath)).toBe(true);
28
+ expect(vol.existsSync(`${forkPath}/resources`)).toBe(true);
29
+ expect(vol.existsSync(`${forkPath}/cache`)).toBe(true);
30
+ expect(vol.existsSync(`${forkPath}/cache/.gitignore`)).toBe(true);
31
+ expect(vol.existsSync(`${forkPath}/accounts.json`)).toBe(true);
32
+ });
33
+
34
+ it('should not overwrite existing files', () => {
35
+ vol.fromJSON({
36
+ [`${forkPath}/accounts.json`]: '{"existing": "data"}',
37
+ });
38
+
39
+ const storage = new ForkStorage(forkPath);
40
+ storage.initialize();
41
+
42
+ const content = vol.readFileSync(`${forkPath}/accounts.json`, 'utf-8');
43
+ expect(content).toBe('{"existing": "data"}');
44
+ });
45
+ });
46
+
47
+ describe('exists', () => {
48
+ it('should return false if fork does not exist', () => {
49
+ const storage = new ForkStorage(forkPath);
50
+ expect(storage.exists()).toBe(false);
51
+ });
52
+
53
+ it('should return false if metadata.json is missing', () => {
54
+ vol.fromJSON({
55
+ [`${forkPath}/accounts.json`]: '{}',
56
+ });
57
+
58
+ const storage = new ForkStorage(forkPath);
59
+ expect(storage.exists()).toBe(false);
60
+ });
61
+
62
+ it('should return true if fork exists with metadata', () => {
63
+ vol.fromJSON({
64
+ [`${forkPath}/metadata.json`]: '{}',
65
+ });
66
+
67
+ const storage = new ForkStorage(forkPath);
68
+ expect(storage.exists()).toBe(true);
69
+ });
70
+ });
71
+
72
+ describe('metadata', () => {
73
+ it('should save and load metadata', () => {
74
+ vol.mkdirSync(forkPath, { recursive: true });
75
+
76
+ const storage = new ForkStorage(forkPath);
77
+ const metadata = {
78
+ network: 'testnet',
79
+ nodeUrl: 'https://testnet.example.com/v1',
80
+ chainId: 250,
81
+ ledgerVersion: '12345',
82
+ timestamp: '1234567890',
83
+ epoch: '100',
84
+ blockHeight: '1000',
85
+ createdAt: '2024-01-01T00:00:00.000Z',
86
+ };
87
+
88
+ storage.saveMetadata(metadata);
89
+ const loaded = storage.loadMetadata();
90
+
91
+ expect(loaded).toEqual(metadata);
92
+ });
93
+
94
+ it('should throw error if metadata does not exist', () => {
95
+ const storage = new ForkStorage(forkPath);
96
+ expect(() => storage.loadMetadata()).toThrow('Fork metadata not found');
97
+ });
98
+ });
99
+
100
+ describe('accounts', () => {
101
+ it('should save and get account state', () => {
102
+ vol.fromJSON({
103
+ [`${forkPath}/accounts.json`]: '{}',
104
+ });
105
+
106
+ const storage = new ForkStorage(forkPath);
107
+ const accountState = {
108
+ sequenceNumber: '10',
109
+ authenticationKey: '0xabc123',
110
+ };
111
+
112
+ storage.saveAccount('0x123', accountState);
113
+ const loaded = storage.getAccount('0x123');
114
+
115
+ expect(loaded).toEqual(accountState);
116
+ });
117
+
118
+ it('should return null for non-existent account', () => {
119
+ vol.fromJSON({
120
+ [`${forkPath}/accounts.json`]: '{}',
121
+ });
122
+
123
+ const storage = new ForkStorage(forkPath);
124
+ const result = storage.getAccount('0xnonexistent');
125
+
126
+ expect(result).toBeNull();
127
+ });
128
+
129
+ it('should list all accounts', () => {
130
+ vol.fromJSON({
131
+ [`${forkPath}/accounts.json`]: JSON.stringify({
132
+ '0x1': { sequenceNumber: '0' },
133
+ '0x2': { sequenceNumber: '5' },
134
+ '0x3': { sequenceNumber: '10' },
135
+ }),
136
+ });
137
+
138
+ const storage = new ForkStorage(forkPath);
139
+ const accounts = storage.listAccounts();
140
+
141
+ expect(accounts).toHaveLength(3);
142
+ expect(accounts).toContain('0x1');
143
+ expect(accounts).toContain('0x2');
144
+ expect(accounts).toContain('0x3');
145
+ });
146
+
147
+ it('should clear all accounts', () => {
148
+ vol.fromJSON({
149
+ [`${forkPath}/accounts.json`]: JSON.stringify({
150
+ '0x1': { sequenceNumber: '0' },
151
+ }),
152
+ });
153
+
154
+ const storage = new ForkStorage(forkPath);
155
+ storage.clearAccounts();
156
+
157
+ const accounts = storage.listAccounts();
158
+ expect(accounts).toHaveLength(0);
159
+ });
160
+ });
161
+
162
+ describe('resources', () => {
163
+ beforeEach(() => {
164
+ vol.fromJSON({
165
+ [`${forkPath}/resources/.gitkeep`]: '',
166
+ });
167
+ });
168
+
169
+ it('should save and get resource', () => {
170
+ const storage = new ForkStorage(forkPath);
171
+ const resource = { value: '100' };
172
+
173
+ storage.saveResource('0x1', '0x1::coin::CoinStore', resource);
174
+ const loaded = storage.getResource('0x1', '0x1::coin::CoinStore');
175
+
176
+ expect(loaded).toEqual(resource);
177
+ });
178
+
179
+ it('should return null for non-existent resource', () => {
180
+ const storage = new ForkStorage(forkPath);
181
+ const result = storage.getResource('0x1', '0x1::nonexistent::Resource');
182
+
183
+ expect(result).toBeNull();
184
+ });
185
+
186
+ it('should get all resources for an account', () => {
187
+ vol.fromJSON({
188
+ [`${forkPath}/resources/0x1.json`]: JSON.stringify({
189
+ '0x1::coin::CoinStore': { value: '100' },
190
+ '0x1::account::Account': { sequence: '5' },
191
+ }),
192
+ });
193
+
194
+ const storage = new ForkStorage(forkPath);
195
+ const resources = storage.getAllResources('0x1');
196
+
197
+ expect(Object.keys(resources)).toHaveLength(2);
198
+ expect(resources['0x1::coin::CoinStore']).toEqual({ value: '100' });
199
+ });
200
+
201
+ it('should check if resource exists', () => {
202
+ vol.fromJSON({
203
+ [`${forkPath}/resources/0x1.json`]: JSON.stringify({
204
+ '0x1::coin::CoinStore': { value: '100' },
205
+ }),
206
+ });
207
+
208
+ const storage = new ForkStorage(forkPath);
209
+
210
+ expect(storage.hasResource('0x1', '0x1::coin::CoinStore')).toBe(true);
211
+ expect(storage.hasResource('0x1', '0x1::nonexistent::Resource')).toBe(false);
212
+ });
213
+
214
+ it('should clear all resources', () => {
215
+ vol.fromJSON({
216
+ [`${forkPath}/resources/0x1.json`]: '{}',
217
+ [`${forkPath}/resources/0x2.json`]: '{}',
218
+ });
219
+
220
+ const storage = new ForkStorage(forkPath);
221
+ storage.clearResources();
222
+
223
+ expect(vol.existsSync(`${forkPath}/resources/0x1.json`)).toBe(false);
224
+ expect(vol.existsSync(`${forkPath}/resources/0x2.json`)).toBe(false);
225
+ });
226
+ });
227
+
228
+ describe('address sanitization', () => {
229
+ beforeEach(() => {
230
+ vol.fromJSON({
231
+ [`${forkPath}/resources/.gitkeep`]: '',
232
+ });
233
+ });
234
+
235
+ it('should handle addresses with 0x prefix', () => {
236
+ const storage = new ForkStorage(forkPath);
237
+ storage.saveResource('0xabc123', 'test::Resource', { value: 1 });
238
+
239
+ expect(vol.existsSync(`${forkPath}/resources/0xabc123.json`)).toBe(true);
240
+ });
241
+
242
+ it('should normalize address to lowercase', () => {
243
+ const storage = new ForkStorage(forkPath);
244
+ storage.saveResource('0xABC123', 'test::Resource', { value: 1 });
245
+
246
+ expect(vol.existsSync(`${forkPath}/resources/0xabc123.json`)).toBe(true);
247
+ });
248
+
249
+ it('should reject invalid address formats', () => {
250
+ const storage = new ForkStorage(forkPath);
251
+
252
+ expect(() => {
253
+ storage.saveResource('../../../etc/passwd', 'test::Resource', { value: 1 });
254
+ }).toThrow('Invalid address format');
255
+
256
+ expect(() => {
257
+ storage.saveResource('0x123/../../etc', 'test::Resource', { value: 1 });
258
+ }).toThrow('Invalid address format');
259
+ });
260
+
261
+ it('should reject addresses with more than 64 hex chars (Movement cap)', () => {
262
+ const storage = new ForkStorage(forkPath);
263
+ const sixtyFiveHex = '0x' + 'a'.repeat(65);
264
+
265
+ expect(() => {
266
+ storage.saveResource(sixtyFiveHex, 'test::Resource', { value: 1 });
267
+ }).toThrow('Invalid address format');
268
+ });
269
+
270
+ it('should accept addresses exactly at the 64 hex char limit', () => {
271
+ const storage = new ForkStorage(forkPath);
272
+ const sixtyFourHex = '0x' + 'a'.repeat(64);
273
+
274
+ expect(() => {
275
+ storage.saveResource(sixtyFourHex, 'test::Resource', { value: 1 });
276
+ }).not.toThrow();
277
+
278
+ expect(vol.existsSync(`${forkPath}/resources/${sixtyFourHex}.json`)).toBe(true);
279
+ });
280
+ });
281
+ });
@@ -0,0 +1,97 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { snapshot, viewForkResource } from '../test.js';
6
+ import type { ChildProcessAdapter, RunResult } from '../../utils/childProcessAdapter.js';
7
+
8
+ /**
9
+ * Guards the exitCode-failure path that CodeRabbit flagged on PR #100:
10
+ * before this hardening, an `aptos` command that exited non-zero with a
11
+ * stderr containing the word "Success" (or no stderr at all) could slip
12
+ * past the stderr-defense check in `snapshot`, and a non-JSON stderr from
13
+ * `view-resource` produced a cryptic JSON parse error instead of the
14
+ * actual aptos failure.
15
+ */
16
+ describe('fork/test — exitCode failure paths', () => {
17
+ let tmpCwd: string;
18
+ let origCwd: string;
19
+
20
+ beforeEach(() => {
21
+ tmpCwd = mkdtempSync(join(tmpdir(), 'movehat-fork-test-'));
22
+ origCwd = process.cwd();
23
+ process.chdir(tmpCwd);
24
+ });
25
+
26
+ afterEach(() => {
27
+ try {
28
+ process.chdir(origCwd);
29
+ } finally {
30
+ rmSync(tmpCwd, { recursive: true, force: true });
31
+ }
32
+ });
33
+
34
+ function adapterReturning(result: RunResult): ChildProcessAdapter {
35
+ return {
36
+ async run() {
37
+ return result;
38
+ },
39
+ spawn() {
40
+ throw new Error('spawn not used in fork/test failure-path tests');
41
+ },
42
+ };
43
+ }
44
+
45
+ it("snapshot throws on non-zero exit even when stderr contains 'Success'", async () => {
46
+ // The pre-fix edge case: aptos exits 1, stderr says
47
+ // "Failed: Success criteria not met" → the stderr.includes('Success')
48
+ // gate returned false-positive ok, and a stale directory from a prior
49
+ // run would mask the failure entirely.
50
+ const adapter = adapterReturning({
51
+ exitCode: 1,
52
+ stdout: '',
53
+ stderr: 'Failed: Success criteria not met for snapshot init',
54
+ });
55
+
56
+ await expect(snapshot({ name: 'edge', adapter })).rejects.toThrow(
57
+ /Success criteria not met/
58
+ );
59
+ });
60
+
61
+ it('snapshot still throws when a stale directory from a prior run exists (the full edge case)', async () => {
62
+ // The pre-fix combined edge case: aptos exits non-zero, stderr happens
63
+ // to contain "Success" (so the stderr.includes('Success') gate would
64
+ // false-positive), AND the snapshot directory already exists from a
65
+ // previous successful run (so the existsSync check would false-positive
66
+ // too). The new exitCode check fires first and throws regardless.
67
+ const stalePath = join(tmpCwd, '.movehat', 'snapshots', 'stale');
68
+ mkdirSync(stalePath, { recursive: true });
69
+ writeFileSync(join(stalePath, 'config.json'), '{}');
70
+
71
+ const adapter = adapterReturning({
72
+ exitCode: 1,
73
+ stdout: '',
74
+ stderr: 'Failed but Success was nearby',
75
+ });
76
+
77
+ await expect(
78
+ snapshot({ name: 'stale', path: stalePath, adapter })
79
+ ).rejects.toThrow(/Failed but Success was nearby/);
80
+ });
81
+
82
+ it('viewForkResource throws on non-zero exit with non-JSON stderr (informative message)', async () => {
83
+ // Pre-fix the failure surfaced as "Unexpected token ..." from
84
+ // JSON.parse, which obscured the actual aptos error.
85
+ const adapter = adapterReturning({
86
+ exitCode: 1,
87
+ stdout: '',
88
+ stderr: 'Error: session not found',
89
+ });
90
+
91
+ await expect(
92
+ viewForkResource('/nonexistent/session', '0x1', '0x1::coin::CoinStore', {
93
+ adapter,
94
+ })
95
+ ).rejects.toThrow(/session not found/);
96
+ });
97
+ });
package/src/fork/api.ts CHANGED
@@ -2,14 +2,21 @@ import https from 'https';
2
2
  import http from 'http';
3
3
  import { URL } from 'url';
4
4
  import type { LedgerInfo, AccountData, AccountResource } from '../types/fork.js';
5
+ import { normalizeAddressShort } from '../utils/address.js';
5
6
 
6
7
  /**
7
- * Client for interacting with Movement/Aptos-compatible JSON API
8
+ * Client for interacting with Movement L1 JSON API.
9
+ *
10
+ * When constructed with an `apiKey`, every outgoing request carries
11
+ * an `Authorization: Bearer <apiKey>` header. Use this for rate-
12
+ * limited public endpoints (e.g. Movement testnet under load) or
13
+ * auth-gated nodes.
8
14
  */
9
15
  export class MovementApiClient {
10
16
  private nodeUrl: string;
17
+ private readonly apiKey?: string;
11
18
 
12
- constructor(nodeUrl: string) {
19
+ constructor(nodeUrl: string, apiKey?: string) {
13
20
  // Remove trailing slash
14
21
  let normalized = nodeUrl.replace(/\/$/, '');
15
22
 
@@ -20,10 +27,16 @@ export class MovementApiClient {
20
27
  }
21
28
 
22
29
  this.nodeUrl = normalized;
30
+ if (apiKey !== undefined) this.apiKey = apiKey;
23
31
  }
24
32
 
25
33
  /**
26
- * Make a GET request to the API
34
+ * Make a GET request to the API.
35
+ *
36
+ * Adds `Authorization: Bearer <apiKey>` when the client was
37
+ * constructed with an `apiKey`. The header is omitted otherwise
38
+ * to preserve backwards-compatible behavior for unauthenticated
39
+ * public endpoints.
27
40
  */
28
41
  private async get<T>(path: string): Promise<T> {
29
42
  const fullUrl = `${this.nodeUrl}${path}`;
@@ -31,8 +44,16 @@ export class MovementApiClient {
31
44
  const isHttps = parsedUrl.protocol === 'https:';
32
45
  const client = isHttps ? https : http;
33
46
 
47
+ const requestOptions: {
48
+ method: 'GET';
49
+ headers?: Record<string, string>;
50
+ } = { method: 'GET' };
51
+ if (this.apiKey !== undefined) {
52
+ requestOptions.headers = { Authorization: `Bearer ${this.apiKey}` };
53
+ }
54
+
34
55
  return new Promise((resolve, reject) => {
35
- const req = client.get(fullUrl, (res) => {
56
+ const req = client.get(fullUrl, requestOptions, (res) => {
36
57
  let data = '';
37
58
 
38
59
  res.on('data', (chunk) => {
@@ -82,10 +103,7 @@ export class MovementApiClient {
82
103
  * Get account information
83
104
  */
84
105
  async getAccount(address: string): Promise<AccountData> {
85
- // Normalize address (ensure 0x prefix and lowercase)
86
- const normalizedAddress = address.toLowerCase().startsWith('0x')
87
- ? address.toLowerCase()
88
- : `0x${address.toLowerCase()}`;
106
+ const normalizedAddress = normalizeAddressShort(address);
89
107
 
90
108
  return this.get<AccountData>(this.apiPath(`/accounts/${normalizedAddress}`));
91
109
  }
@@ -94,9 +112,7 @@ export class MovementApiClient {
94
112
  * Get a specific account resource
95
113
  */
96
114
  async getAccountResource(address: string, resourceType: string): Promise<any> {
97
- const normalizedAddress = address.toLowerCase().startsWith('0x')
98
- ? address.toLowerCase()
99
- : `0x${address.toLowerCase()}`;
115
+ const normalizedAddress = normalizeAddressShort(address);
100
116
 
101
117
  // URL encode the resource type
102
118
  const encodedType = encodeURIComponent(resourceType);
@@ -108,9 +124,7 @@ export class MovementApiClient {
108
124
  * Get all resources for an account
109
125
  */
110
126
  async getAccountResources(address: string): Promise<AccountResource[]> {
111
- const normalizedAddress = address.toLowerCase().startsWith('0x')
112
- ? address.toLowerCase()
113
- : `0x${address.toLowerCase()}`;
127
+ const normalizedAddress = normalizeAddressShort(address);
114
128
 
115
129
  return this.get<AccountResource[]>(this.apiPath(`/accounts/${normalizedAddress}/resources`));
116
130
  }