movehat 0.1.9 → 0.2.1

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 +132 -279
  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 +89 -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 -4
  130. package/dist/core/AccountManager.d.ts.map +1 -1
  131. package/dist/core/AccountManager.js +20 -12
  132. package/dist/core/AccountManager.js.map +1 -1
  133. package/dist/core/Publisher.d.ts +26 -0
  134. package/dist/core/Publisher.d.ts.map +1 -0
  135. package/dist/core/Publisher.js +240 -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 -4
  158. package/dist/core/contract.d.ts.map +1 -1
  159. package/dist/core/contract.js +15 -7
  160. package/dist/core/contract.js.map +1 -1
  161. package/dist/core/deployments.d.ts +2 -8
  162. package/dist/core/deployments.d.ts.map +1 -1
  163. package/dist/core/deployments.js +8 -18
  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 -29
  198. package/dist/fork/manager.d.ts.map +1 -1
  199. package/dist/fork/manager.js +79 -76
  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 +12 -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 +118 -0
  214. package/dist/harness/Harness.d.ts.map +1 -0
  215. package/dist/harness/Harness.js +187 -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 +267 -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 +6 -4
  261. package/dist/helpers/setup.js.map +1 -1
  262. package/dist/helpers/setupLocalTesting.d.ts +31 -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 +6 -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 +26 -239
  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 +39 -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 +29 -0
  330. package/dist/utils/address.d.ts.map +1 -0
  331. package/dist/utils/address.js +48 -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 +108 -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 +15 -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 +111 -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 -22
  385. package/src/core/Publisher.ts +314 -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 -7
  392. package/src/core/deployments.ts +13 -23
  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 -83
  402. package/src/fork/server.ts +53 -19
  403. package/src/fork/storage.ts +12 -15
  404. package/src/fork/test.ts +57 -32
  405. package/src/harness/Harness.ts +222 -0
  406. package/src/harness/codeObject.ts +384 -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 +6 -4
  418. package/src/helpers/setupLocalTesting.ts +218 -200
  419. package/src/helpers/testFixtures.ts +106 -118
  420. package/src/index.ts +8 -3
  421. package/src/node/LocalNodeManager.ts +87 -62
  422. package/src/node/__tests__/LocalNodeManager.test.ts +452 -0
  423. package/src/runtime.ts +28 -288
  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 +39 -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 +52 -0
  442. package/src/utils/childProcessAdapter.ts +214 -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
@@ -1,5 +1,6 @@
1
1
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "fs";
2
2
  import { join } from "path";
3
+ import { logger } from "../ui/index.js";
3
4
 
4
5
  export interface DeploymentInfo {
5
6
  address: string;
@@ -7,8 +8,8 @@ export interface DeploymentInfo {
7
8
  network: string;
8
9
  deployer: string;
9
10
  timestamp: number;
10
- txHash?: string;
11
- blockNumber?: string;
11
+ txHash?: string | undefined;
12
+ blockNumber?: string | undefined;
12
13
  }
13
14
 
14
15
  /**
@@ -30,34 +31,29 @@ export function validateSafeName(name: string, type: "network" | "module"): void
30
31
  );
31
32
  }
32
33
 
33
- // Only allow alphanumeric, hyphens, underscores
34
- const safePattern = /^[a-zA-Z0-9_-]+$/;
35
- if (!safePattern.test(name)) {
34
+ // Reject hidden-file names first so the error message is specific
35
+ // (otherwise the alphanumeric check below would fire generically).
36
+ if (name.startsWith(".")) {
36
37
  throw new Error(
37
38
  `Invalid ${type} name: "${name}"\n` +
38
- `Only alphanumeric characters, hyphens (-), and underscores (_) are allowed.`
39
+ `Names cannot start with a dot (.) to prevent hidden file creation.`
39
40
  );
40
41
  }
41
42
 
42
- // Additional check: prevent starting with dot (hidden files)
43
- if (name.startsWith(".")) {
43
+ // Only allow alphanumeric, hyphens, underscores
44
+ const safePattern = /^[a-zA-Z0-9_-]+$/;
45
+ if (!safePattern.test(name)) {
44
46
  throw new Error(
45
47
  `Invalid ${type} name: "${name}"\n` +
46
- `Names cannot start with a dot (.) to prevent hidden file creation.`
48
+ `Only alphanumeric characters, hyphens (-), and underscores (_) are allowed.`
47
49
  );
48
50
  }
49
51
  }
50
52
 
51
- /**
52
- * Get the deployments directory path
53
- */
54
53
  function getDeploymentsDir(): string {
55
54
  return join(process.cwd(), "deployments");
56
55
  }
57
56
 
58
- /**
59
- * Get the network-specific deployments directory
60
- */
61
57
  function getNetworkDeploymentsDir(network: string): string {
62
58
  // Validate network name to prevent path traversal
63
59
  validateSafeName(network, "network");
@@ -76,9 +72,6 @@ function getNetworkDeploymentsDir(network: string): string {
76
72
  return networkDir;
77
73
  }
78
74
 
79
- /**
80
- * Save a deployment
81
- */
82
75
  export function saveDeployment(deployment: DeploymentInfo): void {
83
76
  // Validate both network and module name
84
77
  validateSafeName(deployment.network, "network");
@@ -89,8 +82,8 @@ export function saveDeployment(deployment: DeploymentInfo): void {
89
82
 
90
83
  try {
91
84
  writeFileSync(filePath, JSON.stringify(deployment, null, 2), "utf-8");
92
- console.log(
93
- `💾 Deployment saved: deployments/${deployment.network}/${deployment.moduleName}.json`
85
+ logger.success(
86
+ `Deployment saved: deployments/${deployment.network}/${deployment.moduleName}.json`
94
87
  );
95
88
  } catch (error) {
96
89
  console.error(
@@ -101,9 +94,6 @@ export function saveDeployment(deployment: DeploymentInfo): void {
101
94
  }
102
95
  }
103
96
 
104
- /**
105
- * Load a deployment
106
- */
107
97
  export function loadDeployment(network: string, moduleName: string): DeploymentInfo | null {
108
98
  // Validate both network and module name
109
99
  validateSafeName(network, "network");
@@ -0,0 +1,179 @@
1
+ import {
2
+ chmodSync,
3
+ existsSync,
4
+ mkdirSync,
5
+ readFileSync,
6
+ renameSync,
7
+ unlinkSync,
8
+ writeFileSync,
9
+ } from "fs";
10
+ import { readFile } from "fs/promises";
11
+ import { dirname } from "path";
12
+ import { randomUUID } from "crypto";
13
+ import * as yaml from "js-yaml";
14
+
15
+ /**
16
+ * Shared helpers for working with the Movement CLI's `~/.aptos/config.yaml`
17
+ * profile file and the SIGINT/SIGTERM cleanup pipeline.
18
+ *
19
+ * Extracted from `core/Publisher.ts` so both the existing `move publish`
20
+ * flow (`Publisher`) and the new `move deploy-object` / `upgrade-object`
21
+ * flows (`harness/codeObject.ts`) can share the bug #36 / #37 / #43
22
+ * hardening without duplicating it.
23
+ *
24
+ * @internal — not exported from `src/index.ts`.
25
+ */
26
+
27
+ /**
28
+ * In-process serializer for `~/.aptos/config.yaml` mutations. Without it,
29
+ * two concurrent profile writes would race in the read-modify-write cycle
30
+ * and the second writer would silently drop the first's profile. See #37.
31
+ */
32
+ let yamlLock: Promise<unknown> = Promise.resolve();
33
+ export function withYamlLock<T>(fn: () => Promise<T>): Promise<T> {
34
+ const prev = yamlLock;
35
+ // .then(success, failure) — continue even if the previous holder rejected,
36
+ // so a failure in one deploy doesn't poison the lock for the others.
37
+ const next = prev.then(
38
+ () => fn(),
39
+ () => fn()
40
+ );
41
+ yamlLock = next.catch(() => {}); // swallow on the shared chain; caller still gets the original
42
+ return next;
43
+ }
44
+
45
+ export interface ProfileData {
46
+ private_key: string;
47
+ public_key: string;
48
+ account: string;
49
+ rest_url: string;
50
+ }
51
+
52
+ interface AptosConfigYaml {
53
+ profiles?: Record<string, ProfileData>;
54
+ [key: string]: unknown;
55
+ }
56
+
57
+ /**
58
+ * Atomic write: write payload to a temp sibling → chmod the temp to 0o600
59
+ * → rename over the target. The chmod-before-rename order eliminates a
60
+ * window where the target file could be observable with default umask
61
+ * perms (typically 0o644) while carrying the private key.
62
+ */
63
+ function atomicWriteYaml(path: string, content: string): void {
64
+ const tmpPath = `${path}.tmp.${randomUUID().slice(0, 8)}`;
65
+ writeFileSync(tmpPath, content, { mode: 0o600 });
66
+ chmodSync(tmpPath, 0o600); // defense in depth in case umask filtered the open mode
67
+ renameSync(tmpPath, path);
68
+ }
69
+
70
+ /** Add the deploy's profile to ~/.aptos/config.yaml. Creates the file if absent. */
71
+ export async function addProfile(
72
+ configPath: string,
73
+ name: string,
74
+ data: ProfileData
75
+ ): Promise<void> {
76
+ const configDir = dirname(configPath);
77
+ if (!existsSync(configDir)) {
78
+ mkdirSync(configDir, { recursive: true, mode: 0o700 });
79
+ }
80
+ let yamlObj: AptosConfigYaml = {};
81
+ if (existsSync(configPath)) {
82
+ const raw = await readFile(configPath, "utf-8");
83
+ yamlObj = (yaml.load(raw) as AptosConfigYaml) || {};
84
+ }
85
+ if (!yamlObj.profiles) yamlObj.profiles = {};
86
+ yamlObj.profiles[name] = data;
87
+ atomicWriteYaml(configPath, yaml.dump(yamlObj));
88
+ }
89
+
90
+ /**
91
+ * Remove the deploy's profile from ~/.aptos/config.yaml. Idempotent —
92
+ * a missing file or missing profile is a no-op. If removal leaves the
93
+ * yaml with only an empty `profiles:` block, the whole file is unlinked
94
+ * to preserve the "didn't exist before" semantic for the first-ever deploy.
95
+ */
96
+ export async function removeProfile(configPath: string, name: string): Promise<void> {
97
+ if (!existsSync(configPath)) return;
98
+ const raw = await readFile(configPath, "utf-8");
99
+ const yamlObj: AptosConfigYaml = (yaml.load(raw) as AptosConfigYaml) || {};
100
+ if (!yamlObj.profiles || !(name in yamlObj.profiles)) return;
101
+ delete yamlObj.profiles[name];
102
+
103
+ const profilesEmpty = Object.keys(yamlObj.profiles).length === 0;
104
+ const onlyProfilesKey =
105
+ Object.keys(yamlObj).length === 1 && "profiles" in yamlObj;
106
+ if (profilesEmpty && onlyProfilesKey) {
107
+ // We created this file fresh; remove it.
108
+ try {
109
+ unlinkSync(configPath);
110
+ } catch {
111
+ // best-effort
112
+ }
113
+ return;
114
+ }
115
+ atomicWriteYaml(configPath, yaml.dump(yamlObj));
116
+ }
117
+
118
+ /**
119
+ * Synchronous twin of `removeProfile` for the SIGINT/SIGTERM handler.
120
+ * The event loop is dead by the time the handler runs — we cannot
121
+ * await. Bypasses the async mutex because signal handlers are
122
+ * sequential by construction; the operation is idempotent so a
123
+ * benign double-delete (handler then finally, or vice versa) is fine.
124
+ */
125
+ export function removeProfileSync(configPath: string, name: string): void {
126
+ try {
127
+ if (!existsSync(configPath)) return;
128
+ const raw = readFileSync(configPath, "utf-8");
129
+ const yamlObj: AptosConfigYaml = (yaml.load(raw) as AptosConfigYaml) || {};
130
+ if (!yamlObj.profiles || !(name in yamlObj.profiles)) return;
131
+ delete yamlObj.profiles[name];
132
+
133
+ const profilesEmpty = Object.keys(yamlObj.profiles).length === 0;
134
+ const onlyProfilesKey =
135
+ Object.keys(yamlObj).length === 1 && "profiles" in yamlObj;
136
+ if (profilesEmpty && onlyProfilesKey) {
137
+ unlinkSync(configPath);
138
+ return;
139
+ }
140
+ atomicWriteYaml(configPath, yaml.dump(yamlObj));
141
+ } catch {
142
+ // Signal handlers should never throw — swallow and exit. Better to
143
+ // leave a stale profile (recoverable by re-running the deploy) than
144
+ // to crash the parent process mid-shutdown.
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Process-level signal handling. A single registered handler iterates
150
+ * the per-deploy cleanup callbacks. Install-once because multiple
151
+ * concurrent deploys share the same parent process — installing per
152
+ * deploy would re-add the listener and exceed Node's max-listeners
153
+ * warning threshold under heavy parallelism.
154
+ */
155
+ export const cleanupCallbacks = new Set<() => void>();
156
+ let signalHandlerInstalled = false;
157
+
158
+ export function ensureSignalHandler(): void {
159
+ if (signalHandlerInstalled) return;
160
+ signalHandlerInstalled = true;
161
+ const handler = (sig: NodeJS.Signals) => {
162
+ // Synchronous cleanup of every active deploy's profile entry.
163
+ for (const cb of [...cleanupCallbacks]) {
164
+ try {
165
+ cb();
166
+ } catch {
167
+ /* sync best-effort */
168
+ }
169
+ }
170
+ // Defer the actual exit one tick so other listeners (vitest's own
171
+ // SIGINT handler, app-level shutdown hooks) still get to run.
172
+ // Without this we'd stomp on vitest's afterEach if a dev Ctrl+C'd
173
+ // a test run mid-suite.
174
+ const code = sig === "SIGTERM" ? 143 : 130;
175
+ setImmediate(() => process.exit(code));
176
+ };
177
+ process.on("SIGINT", handler);
178
+ process.on("SIGTERM", handler);
179
+ }
package/src/core/shell.ts CHANGED
@@ -16,19 +16,20 @@ export function escapeShellArg(arg: string): string {
16
16
  }
17
17
 
18
18
  /**
19
- * Validates that a path is safe (no command injection characters)
20
- * and returns the escaped version
19
+ * Validates that a path is safe (no command injection characters) and
20
+ * returns it unchanged. Use this for callers that pass paths to spawn-with-
21
+ * args (no shell), where shell quoting would be incorrect.
21
22
  *
22
- * @param path - The path to validate and escape
23
+ * @param path - The path to validate
23
24
  * @param name - Name for error messages (e.g., "package directory")
24
- * @returns The escaped path safe for shell execution
25
+ * @returns The original path, after validation
25
26
  */
26
- export function validateAndEscapePath(path: string, name: string = "path"): string {
27
+ export function validatePathSafety(path: string, name: string = "path"): string {
27
28
  if (!path || typeof path !== "string") {
28
29
  throw new Error(`Invalid ${name}: must be a non-empty string`);
29
30
  }
30
31
 
31
- // Check for obvious command injection attempts
32
+ // Check for obvious command injection attempts.
32
33
  const dangerousChars = /[;&|`$(){}[\]<>]/;
33
34
  if (dangerousChars.test(path)) {
34
35
  throw new Error(
@@ -38,22 +39,32 @@ export function validateAndEscapePath(path: string, name: string = "path"): stri
38
39
  );
39
40
  }
40
41
 
41
- // Escape for shell safety
42
- return escapeShellArg(path);
42
+ return path;
43
43
  }
44
44
 
45
45
  /**
46
- * Validates that a profile name is safe
46
+ * Validates a path and returns the shell-escaped form. Wraps
47
+ * `validatePathSafety` for callers that pass paths into shell-style
48
+ * commands (e.g. `exec`).
47
49
  *
48
- * @param profile - The profile name to validate
49
- * @returns The escaped profile name
50
+ * @param path - The path to validate and escape
51
+ * @param name - Name for error messages
52
+ * @returns The escaped path safe for shell execution
50
53
  */
51
- export function validateAndEscapeProfile(profile: string): string {
54
+ export function validateAndEscapePath(path: string, name: string = "path"): string {
55
+ return escapeShellArg(validatePathSafety(path, name));
56
+ }
57
+
58
+ /**
59
+ * Validates that a profile name is safe and returns it unchanged. Mirrors
60
+ * `validatePathSafety` — use this for callers that pass the profile to
61
+ * spawn-with-args (no shell), where shell quoting would be incorrect.
62
+ */
63
+ export function validateProfileSafety(profile: string): string {
52
64
  if (!profile || typeof profile !== "string") {
53
65
  throw new Error("Invalid profile name: must be a non-empty string");
54
66
  }
55
67
 
56
- // Profile names should only contain alphanumeric, hyphens, underscores
57
68
  const safePattern = /^[a-zA-Z0-9_-]+$/;
58
69
  if (!safePattern.test(profile)) {
59
70
  throw new Error(
@@ -62,5 +73,14 @@ export function validateAndEscapeProfile(profile: string): string {
62
73
  );
63
74
  }
64
75
 
65
- return escapeShellArg(profile);
76
+ return profile;
77
+ }
78
+
79
+ /**
80
+ * Validates a profile and returns the shell-escaped form. Wraps
81
+ * `validateProfileSafety` for callers that pass the profile into shell-style
82
+ * commands (e.g. `exec`).
83
+ */
84
+ export function validateAndEscapeProfile(profile: string): string {
85
+ return escapeShellArg(validateProfileSafety(profile));
66
86
  }
package/src/errors.ts CHANGED
@@ -19,3 +19,63 @@ export class ModuleAlreadyDeployedError extends Error {
19
19
  }
20
20
  }
21
21
  }
22
+
23
+ import { redactSecrets } from './utils/redact.js';
24
+ import type { DeploymentInfo } from './core/deployments.js';
25
+
26
+ /**
27
+ * Thrown when the on-chain publish succeeded but a subsequent local
28
+ * step (saveDeployment, profile cleanup, etc.) failed.
29
+ *
30
+ * Distinct from `CliExecutionError`: by the time this error fires, the
31
+ * module IS deployed on-chain. Callers that want to recover can read
32
+ * `deployment` and re-attempt the local-side persistence manually
33
+ * (e.g. write the JSON to `deployments/{network}/{moduleName}.json`).
34
+ *
35
+ * Without this distinction, the same outer catch would surface a
36
+ * post-publish filesystem failure as "Failed to publish module",
37
+ * inviting an accidental redeploy that wastes gas.
38
+ */
39
+ export class PostPublishError extends Error {
40
+ constructor(
41
+ message: string,
42
+ public readonly deployment: DeploymentInfo,
43
+ public readonly cause: Error
44
+ ) {
45
+ super(message);
46
+ this.name = 'PostPublishError';
47
+
48
+ if (Error.captureStackTrace) {
49
+ Error.captureStackTrace(this, PostPublishError);
50
+ }
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Thrown by runCli when a spawned process exits with a non-zero status.
56
+ *
57
+ * `stderr`, `stdoutPreview`, and each entry in `args` are redacted of
58
+ * well-known secret shapes (private keys, etc.) in the constructor, so the
59
+ * error is safe to log regardless of how it was raised. Redaction is
60
+ * idempotent.
61
+ */
62
+ export class CliExecutionError extends Error {
63
+ public readonly args: readonly string[];
64
+
65
+ constructor(
66
+ message: string,
67
+ public readonly command: string,
68
+ args: readonly string[],
69
+ public readonly exitCode: number,
70
+ public readonly stderr: string,
71
+ public readonly stdoutPreview: string
72
+ ) {
73
+ super(message);
74
+ this.name = 'CliExecutionError';
75
+ this.args = args.map(redactSecrets);
76
+
77
+ if (Error.captureStackTrace) {
78
+ Error.captureStackTrace(this, CliExecutionError);
79
+ }
80
+ }
81
+ }