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,95 @@
1
+ /**
2
+ * Stand-alone child-process harness for the SIGINT-cleanup test in
3
+ * `deployContract.test.ts`. Run via tsx by the parent test; never picked
4
+ * up by vitest's test glob (default matches `*.{test,spec}.?(c|m)[jt]s`).
5
+ *
6
+ * Behavior:
7
+ * 1. Build a fake ChildProcessAdapter whose `publish` step awaits a
8
+ * long delay (3 seconds) — gives the parent test plenty of time to
9
+ * send SIGINT mid-flight.
10
+ * 2. Drive `Publisher.deploy()` against the fake adapter using a
11
+ * synthetic MovehatConfig + Account read from env vars.
12
+ * 3. Write the chosen `movehat-deploy-<uuid>` profile name to stdout
13
+ * as JSON (`{"profile": "..."}`) before the slow publish so the
14
+ * parent test knows which key to look for after SIGINT.
15
+ * 4. If the deploy completes naturally (test failure case), exit 0.
16
+ * 5. When SIGINT arrives, Publisher's signal handler runs synchronous
17
+ * cleanup and `setImmediate(() => process.exit(130))`.
18
+ *
19
+ * The parent test does NOT import this file — it spawns it via
20
+ * `child_process.spawn(node, [tsx, harness, ...])` so the harness runs
21
+ * in its own process with its own signal-handler installation.
22
+ */
23
+
24
+ import { Account, Ed25519PrivateKey } from "@aptos-labs/ts-sdk";
25
+ import { Publisher } from "../../core/Publisher.js";
26
+ import type {
27
+ ChildProcessAdapter,
28
+ RunInput,
29
+ RunResult,
30
+ } from "../../utils/childProcessAdapter.js";
31
+ import type { MovehatConfig } from "../../types/config.js";
32
+
33
+ // Deterministic test key — must satisfy the Movement TypeScript SDK's Ed25519 parser.
34
+ // Same key the testnet auto-config uses in `core/config.ts:147-155`.
35
+ const TEST_PRIVATE_KEY =
36
+ "0x0000000000000000000000000000000000000000000000000000000000000001";
37
+
38
+ async function main() {
39
+ const account = Account.fromPrivateKey({
40
+ privateKey: new Ed25519PrivateKey(TEST_PRIVATE_KEY),
41
+ });
42
+
43
+ const config: MovehatConfig = {
44
+ network: "testnet",
45
+ rpc: "https://testnet.invalid/v1",
46
+ privateKey: TEST_PRIVATE_KEY,
47
+ allAccounts: [TEST_PRIVATE_KEY],
48
+ profile: "default",
49
+ moveDir: "./move",
50
+ account: account.accountAddress.toString(),
51
+ namedAddresses: {},
52
+ networkConfig: {
53
+ url: "https://testnet.invalid/v1",
54
+ chainId: "testnet",
55
+ },
56
+ };
57
+
58
+ const slowPublishAdapter: ChildProcessAdapter = {
59
+ async run(input: RunInput): Promise<RunResult> {
60
+ if (input.args[1] === "build") {
61
+ return { exitCode: 0, stdout: "built", stderr: "" };
62
+ }
63
+ if (input.args[1] === "publish") {
64
+ // Surface the unique profile name to the parent BEFORE blocking.
65
+ const profileIdx = input.args.indexOf("--profile");
66
+ const profile = profileIdx >= 0 ? input.args[profileIdx + 1] : "";
67
+ process.stdout.write(JSON.stringify({ profile }) + "\n");
68
+ // Hold long enough for the parent to deliver SIGINT.
69
+ await new Promise((r) => setTimeout(r, 3000));
70
+ return {
71
+ exitCode: 0,
72
+ stdout: "Transaction hash: 0x" + "f".repeat(64),
73
+ stderr: "",
74
+ };
75
+ }
76
+ throw new Error(`unexpected subcommand: ${input.args[1]}`);
77
+ },
78
+ spawn() {
79
+ throw new Error("spawn not used");
80
+ },
81
+ };
82
+
83
+ const publisher = new Publisher({ adapter: slowPublishAdapter });
84
+ await publisher.deploy({
85
+ moduleName: "sigint_harness",
86
+ config,
87
+ account,
88
+ packageDir: process.cwd(),
89
+ });
90
+ }
91
+
92
+ main().catch((err) => {
93
+ process.stderr.write(`harness error: ${(err as Error).message}\n`);
94
+ process.exit(2);
95
+ });
@@ -0,0 +1,143 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import type { ClientRequest, IncomingMessage } from "node:http";
3
+ import { EventEmitter } from "node:events";
4
+
5
+ /**
6
+ * Tests for `MovementApiClient` Authorization header injection (M2.4
7
+ * follow-up — wires the apiKey threading from `Harness.createFork`).
8
+ *
9
+ * Strategy: `vi.mock` `node:https` and `node:http` so the test
10
+ * captures the request options passed to `client.get(url, options, cb)`
11
+ * without making real network requests. Two assertions:
12
+ *
13
+ * 1. When the client is constructed with an apiKey, every `get`
14
+ * call carries `Authorization: Bearer <apiKey>` in
15
+ * `options.headers`.
16
+ * 2. When constructed without an apiKey, no Authorization header
17
+ * is added (back-compat for unauthenticated public endpoints).
18
+ */
19
+
20
+ const httpsGet = vi.fn();
21
+ const httpGet = vi.fn();
22
+
23
+ vi.mock("https", () => ({
24
+ default: { get: httpsGet },
25
+ get: httpsGet,
26
+ }));
27
+ vi.mock("http", () => ({
28
+ default: { get: httpGet },
29
+ get: httpGet,
30
+ }));
31
+
32
+ /**
33
+ * Build a fake `IncomingMessage`-like emitter that immediately emits
34
+ * a valid JSON body and ends. The MovementApiClient.get callback
35
+ * consumes the response via `data` / `end` events.
36
+ */
37
+ function makeFakeResponse(body: string, statusCode = 200): IncomingMessage {
38
+ const res = new EventEmitter() as unknown as IncomingMessage;
39
+ (res as unknown as { statusCode: number }).statusCode = statusCode;
40
+ // Use setImmediate so the listener attaches before the events fire.
41
+ setImmediate(() => {
42
+ (res as unknown as EventEmitter).emit("data", body);
43
+ (res as unknown as EventEmitter).emit("end");
44
+ });
45
+ return res;
46
+ }
47
+
48
+ /**
49
+ * Capture the options arg from `client.get(url, options, callback)`
50
+ * and immediately resolve with a fake successful ledger-info response.
51
+ * Returns the captured options for assertion.
52
+ */
53
+ function setupGetCapture(): {
54
+ captured: { url?: string; options?: { headers?: Record<string, string> } };
55
+ } {
56
+ const captured: {
57
+ url?: string;
58
+ options?: { headers?: Record<string, string> };
59
+ } = {};
60
+
61
+ const handler = (
62
+ url: string,
63
+ options:
64
+ | { headers?: Record<string, string> }
65
+ | ((res: IncomingMessage) => void),
66
+ cb?: (res: IncomingMessage) => void
67
+ ): ClientRequest => {
68
+ captured.url = url;
69
+ // Distinguish (url, callback) vs (url, options, callback) overloads.
70
+ let callback: ((res: IncomingMessage) => void) | undefined;
71
+ if (typeof options === "function") {
72
+ callback = options;
73
+ } else {
74
+ captured.options = options;
75
+ callback = cb;
76
+ }
77
+
78
+ const fakeReq = new EventEmitter() as unknown as ClientRequest;
79
+ (fakeReq as unknown as { end: () => void }).end = () => {};
80
+
81
+ if (callback) {
82
+ const body = JSON.stringify({
83
+ chain_id: 250,
84
+ ledger_version: "1",
85
+ ledger_timestamp: "0",
86
+ epoch: "0",
87
+ block_height: "0",
88
+ });
89
+ callback(makeFakeResponse(body));
90
+ }
91
+ return fakeReq;
92
+ };
93
+
94
+ httpsGet.mockImplementation(handler);
95
+ httpGet.mockImplementation(handler);
96
+
97
+ return { captured };
98
+ }
99
+
100
+ describe("MovementApiClient — Authorization header (apiKey wiring)", () => {
101
+ beforeEach(() => {
102
+ httpsGet.mockReset();
103
+ httpGet.mockReset();
104
+ });
105
+
106
+ afterEach(() => {
107
+ vi.restoreAllMocks();
108
+ });
109
+
110
+ it("injects 'Authorization: Bearer <apiKey>' when constructed with an apiKey", async () => {
111
+ const { captured } = setupGetCapture();
112
+
113
+ const { MovementApiClient } = await import("../../fork/api.js");
114
+ const client = new MovementApiClient(
115
+ "https://testnet.example.com/v1",
116
+ "secret-key-123"
117
+ );
118
+
119
+ await client.getLedgerInfo();
120
+
121
+ expect(captured.url).toBe("https://testnet.example.com/v1/");
122
+ expect(captured.options).toBeDefined();
123
+ expect(captured.options?.headers).toEqual({
124
+ Authorization: "Bearer secret-key-123",
125
+ });
126
+ expect(httpsGet).toHaveBeenCalledTimes(1);
127
+ });
128
+
129
+ it("omits the Authorization header when constructed without an apiKey (back-compat)", async () => {
130
+ const { captured } = setupGetCapture();
131
+
132
+ const { MovementApiClient } = await import("../../fork/api.js");
133
+ const client = new MovementApiClient("https://testnet.example.com/v1");
134
+
135
+ await client.getLedgerInfo();
136
+
137
+ expect(captured.url).toBe("https://testnet.example.com/v1/");
138
+ if (captured.options !== undefined) {
139
+ expect(captured.options.headers).toBeUndefined();
140
+ }
141
+ expect(httpsGet).toHaveBeenCalledTimes(1);
142
+ });
143
+ });
@@ -0,0 +1,57 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+
3
+ import { Harness } from "../../harness/index.js";
4
+ import { setupHarnessTestFixture, type HarnessTestFixture } from "./_fixture.js";
5
+
6
+ describe("Harness.createLive", () => {
7
+ let fixture: HarnessTestFixture;
8
+
9
+ beforeEach(() => {
10
+ fixture = setupHarnessTestFixture({
11
+ extraNetworks: {
12
+ custom: {
13
+ url: "https://custom.example.com/v1",
14
+ chainId: "custom",
15
+ accounts: ["0x" + "a".repeat(64)],
16
+ },
17
+ },
18
+ });
19
+ });
20
+
21
+ afterEach(() => {
22
+ fixture.teardown();
23
+ });
24
+
25
+ it("returns a Harness bound to the requested network with mode='live'", async () => {
26
+ const harness = await Harness.createLive("testnet");
27
+ try {
28
+ expect(harness.mode).toBe("live");
29
+ expect(harness.runtime).toBeDefined();
30
+ expect(harness.runtime.network.name).toBe("testnet");
31
+ expect(harness.runtime.network.rpc).toContain("testnet.movementnetwork.xyz");
32
+ // createLive does not own a local node or fork server.
33
+ expect(harness.localNode).toBeUndefined();
34
+ expect(harness.forkServer).toBeUndefined();
35
+ expect(harness.forkManager).toBeUndefined();
36
+ } finally {
37
+ await harness.cleanup();
38
+ }
39
+ });
40
+
41
+ it("can switch networks via the first argument", async () => {
42
+ const harness = await Harness.createLive("custom");
43
+ try {
44
+ expect(harness.runtime.network.name).toBe("custom");
45
+ expect(harness.runtime.network.rpc).toContain("custom.example.com");
46
+ } finally {
47
+ await harness.cleanup();
48
+ }
49
+ });
50
+
51
+ it("cleanup() is a no-op for createLive (no owned services) but still poisons", async () => {
52
+ const harness = await Harness.createLive("testnet");
53
+ expect(harness.poisoned).toBe(false);
54
+ await harness.cleanup();
55
+ expect(harness.poisoned).toBe(true);
56
+ });
57
+ });
@@ -0,0 +1,115 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+
3
+ import { Harness, HarnessDisposedError } from "../../harness/index.js";
4
+ import { setupHarnessTestFixture, type HarnessTestFixture } from "./_fixture.js";
5
+
6
+ /**
7
+ * Proxy poisoning is the load-bearing safety guarantee of M2: once a
8
+ * Harness has been cleaned up, any further deploy / view / script /
9
+ * upgrade call must throw `HarnessDisposedError` synchronously on
10
+ * property access — not after the awaited method body. These tests
11
+ * lock that contract.
12
+ *
13
+ * Uses `Harness.createLive(network)` because it does not spawn a real
14
+ * Movement node — `initRuntime` only constructs the SDK client (no RPC
15
+ * round-trip) from the fixture config. `createLocal` / `createFork`
16
+ * runtime tests live in the M4 integration suite where spinning a real
17
+ * node is acceptable.
18
+ */
19
+ describe("Harness — proxy poisoning", () => {
20
+ let fixture: HarnessTestFixture;
21
+
22
+ beforeEach(() => {
23
+ fixture = setupHarnessTestFixture();
24
+ });
25
+
26
+ afterEach(() => {
27
+ fixture.teardown();
28
+ });
29
+
30
+ it("cleanup() flips poisoned to true", async () => {
31
+ const harness = await Harness.createLive("testnet");
32
+ expect(harness.poisoned).toBe(false);
33
+ await harness.cleanup();
34
+ expect(harness.poisoned).toBe(true);
35
+ });
36
+
37
+ it("cleanup() is idempotent", async () => {
38
+ const harness = await Harness.createLive("testnet");
39
+ await harness.cleanup();
40
+ // Second call must not throw and must leave the harness poisoned.
41
+ await expect(harness.cleanup()).resolves.toBeUndefined();
42
+ expect(harness.poisoned).toBe(true);
43
+ });
44
+
45
+ it("post-cleanup, deployCodeObject throws HarnessDisposedError synchronously on property access", async () => {
46
+ const harness = await Harness.createLive("testnet");
47
+ await harness.cleanup();
48
+
49
+ // Property access itself throws — the call site never gets a Promise back.
50
+ // The args ({moduleName: "x"}) typecheck but never execute (the get trap
51
+ // fires before the method body runs).
52
+ expect(() => harness.deployCodeObject({ moduleName: "x" })).toThrow(
53
+ HarnessDisposedError
54
+ );
55
+ });
56
+
57
+ it("post-cleanup, upgradeCodeObject / runViewFunction / runMoveScript all throw HarnessDisposedError synchronously", async () => {
58
+ const harness = await Harness.createLive("testnet");
59
+ await harness.cleanup();
60
+
61
+ expect(() =>
62
+ harness.upgradeCodeObject({ moduleName: "x", objectAddress: "0x1" })
63
+ ).toThrow(HarnessDisposedError);
64
+ expect(() =>
65
+ harness.runViewFunction({ function: "0x1::m::f" })
66
+ ).toThrow(HarnessDisposedError);
67
+ expect(() =>
68
+ harness.runMoveScript({ scriptPath: "irrelevant.move" })
69
+ ).toThrow(HarnessDisposedError);
70
+ });
71
+
72
+ it("HarnessDisposedError carries the offending method name", async () => {
73
+ const harness = await Harness.createLive("testnet");
74
+ await harness.cleanup();
75
+
76
+ let captured: unknown;
77
+ try {
78
+ harness.deployCodeObject({ moduleName: "x" });
79
+ } catch (err) {
80
+ captured = err;
81
+ }
82
+ expect(captured).toBeInstanceOf(HarnessDisposedError);
83
+ expect((captured as HarnessDisposedError).methodName).toBe("deployCodeObject");
84
+ });
85
+
86
+ it("post-cleanup, metadata accessors (mode, poisoned, runtime) still work", async () => {
87
+ const harness = await Harness.createLive("testnet");
88
+ await harness.cleanup();
89
+
90
+ // None of these should throw — only the 4 poisoned methods do.
91
+ expect(harness.mode).toBe("live");
92
+ expect(harness.poisoned).toBe(true);
93
+ expect(harness.runtime).toBeDefined();
94
+ });
95
+
96
+ // The M2.3-era "stubs reject" assertion was retired when M2.3 shipped
97
+ // real bodies for runViewFunction and runMoveScript. All four methods
98
+ // now have dedicated test suites (codeObject.deploy/upgrade.test.ts,
99
+ // view.test.ts, script.test.ts).
100
+
101
+ it("await harness.someAsyncMethod() pattern: post-cleanup throw happens before await", async () => {
102
+ const harness = await Harness.createLive("testnet");
103
+ await harness.cleanup();
104
+
105
+ // The error is synchronous (property access), but the typical caller
106
+ // shape uses await. Confirm that pattern surfaces the error too.
107
+ let captured: unknown;
108
+ try {
109
+ await harness.deployCodeObject({ moduleName: "x" });
110
+ } catch (err) {
111
+ captured = err;
112
+ }
113
+ expect(captured).toBeInstanceOf(HarnessDisposedError);
114
+ });
115
+ });
@@ -0,0 +1,131 @@
1
+ import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { _resetConfigCache } from "../../core/config.js";
5
+
6
+ /**
7
+ * Shared test fixture for Harness tests.
8
+ *
9
+ * Six test files in `__tests__/harness/` all needed the same setup
10
+ * boilerplate (~30 LoC each) before this helper landed: tmpdir for
11
+ * cwd, write a `movehat.config.js`, write a minimal Move package
12
+ * (`move/Move.toml` + `move/sources/dummy.move`), chdir, reset the
13
+ * mtime-based config cache, manage HOME for tests that exercise
14
+ * `~/.aptos/config.yaml` profile management. Extracted as a single
15
+ * helper to eliminate the drift surface across siblings.
16
+ *
17
+ * The defaults match the most common test shape: a single `testnet`
18
+ * network and no HOME management. Tests that need more (a `custom`
19
+ * network for switching, an isolated HOME for profile tests) opt in
20
+ * via the options.
21
+ *
22
+ * @internal — not exported from `src/index.ts`. Test-only.
23
+ */
24
+
25
+ /**
26
+ * Additional networks to merge into the fixture's `movehat.config.js`.
27
+ * Keyed by network name. Each network needs `url` + `chainId` at
28
+ * minimum; pass `accounts` when the test exercises a code path that
29
+ * requires explicit account configuration (e.g. mainnet-like security
30
+ * checks in `resolveNetworkConfig`).
31
+ */
32
+ export interface ExtraNetwork {
33
+ url: string;
34
+ chainId: string;
35
+ accounts?: string[];
36
+ }
37
+
38
+ export interface HarnessTestFixtureOptions {
39
+ /** Additional networks merged on top of the default `testnet` entry. */
40
+ extraNetworks?: Record<string, ExtraNetwork>;
41
+
42
+ /**
43
+ * When `true`, manage a separate `process.env.HOME` directory for
44
+ * the test. Used by tests that exercise `~/.aptos/config.yaml`
45
+ * profile writes (codeObject.* and script.* test suites).
46
+ */
47
+ withTmpHome?: boolean;
48
+ }
49
+
50
+ export interface HarnessTestFixture {
51
+ /** Fresh per-test cwd. The test is chdir'd here. */
52
+ tmpCwd: string;
53
+ /** Fresh per-test HOME, only set when `withTmpHome: true`. */
54
+ tmpHome?: string;
55
+ /** Restore cwd + HOME, remove the tmp dirs, and reset config cache. */
56
+ teardown: () => void;
57
+ }
58
+
59
+ /**
60
+ * Build a fresh per-test fixture. Call from `beforeEach`, capture the
61
+ * returned object, and call `fixture.teardown()` in `afterEach`.
62
+ */
63
+ export function setupHarnessTestFixture(
64
+ options: HarnessTestFixtureOptions = {}
65
+ ): HarnessTestFixture {
66
+ const tmpCwd = mkdtempSync(join(tmpdir(), "movehat-harness-test-"));
67
+ const tmpHome = options.withTmpHome
68
+ ? mkdtempSync(join(tmpdir(), "movehat-harness-home-"))
69
+ : undefined;
70
+
71
+ // Build the network map. Default `testnet` + caller's extras.
72
+ const networks: Record<string, ExtraNetwork> = {
73
+ testnet: {
74
+ url: "https://testnet.movementnetwork.xyz/v1",
75
+ chainId: "testnet",
76
+ },
77
+ ...(options.extraNetworks ?? {}),
78
+ };
79
+
80
+ writeFileSync(
81
+ join(tmpCwd, "movehat.config.js"),
82
+ `export default {
83
+ defaultNetwork: "testnet",
84
+ networks: ${JSON.stringify(networks, null, 2)}
85
+ };
86
+ `
87
+ );
88
+
89
+ // Minimal Move package — `extractNamedAddresses` reads from
90
+ // `<moveDir>/sources/*.move`; an empty file yields an empty Set.
91
+ const moveDir = join(tmpCwd, "move");
92
+ mkdirSync(join(moveDir, "sources"), { recursive: true });
93
+ writeFileSync(
94
+ join(moveDir, "Move.toml"),
95
+ `[package]
96
+ name = "dummy"
97
+ version = "0.0.1"
98
+
99
+ [addresses]
100
+ `
101
+ );
102
+ writeFileSync(join(moveDir, "sources", "dummy.move"), "// intentionally empty\n");
103
+
104
+ const origCwd = process.cwd();
105
+ const origHome = process.env.HOME;
106
+ process.chdir(tmpCwd);
107
+ if (tmpHome !== undefined) process.env.HOME = tmpHome;
108
+ _resetConfigCache();
109
+
110
+ const teardown = () => {
111
+ try {
112
+ process.chdir(origCwd);
113
+ } finally {
114
+ if (options.withTmpHome) {
115
+ if (origHome === undefined) delete process.env.HOME;
116
+ else process.env.HOME = origHome;
117
+ if (tmpHome !== undefined && existsSync(tmpHome)) {
118
+ rmSync(tmpHome, { recursive: true, force: true });
119
+ }
120
+ }
121
+ if (existsSync(tmpCwd)) {
122
+ rmSync(tmpCwd, { recursive: true, force: true });
123
+ }
124
+ _resetConfigCache();
125
+ }
126
+ };
127
+
128
+ const fixture: HarnessTestFixture = { tmpCwd, teardown };
129
+ if (tmpHome !== undefined) fixture.tmpHome = tmpHome;
130
+ return fixture;
131
+ }