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
@@ -50,16 +50,10 @@ declare module 'movehat' {
50
50
  createAccount: () => Account;
51
51
  getAccount: (privateKey: string) => Account;
52
52
  getAccountByIndex: (index: number) => Account;
53
- switchNetwork: (networkName: string) => Promise<void>;
53
+ switchNetwork: (networkName: string) => Promise<MovehatRuntime>;
54
54
  }
55
55
 
56
- export function getMovehat(): Promise<MovehatRuntime>;
57
56
  export function initRuntime(configOverride?: Partial<MovehatConfig>): Promise<MovehatRuntime>;
58
- export function getRuntime(): MovehatRuntime;
59
-
60
- export const mh: {
61
- readonly runtime: MovehatRuntime;
62
- };
63
57
  }
64
58
 
65
59
  declare module 'movehat/helpers' {
@@ -68,12 +62,15 @@ declare module 'movehat/helpers' {
68
62
  export interface TestEnvironment {
69
63
  aptos: Aptos;
70
64
  account: Account;
71
- config: any;
65
+ config: import('movehat').MovehatConfig;
72
66
  }
73
67
 
74
68
  export class MoveContract {
75
69
  constructor(aptos: Aptos, address: string, moduleName: string);
76
- call(sender: Account, functionName: string, args: any[]): Promise<any>;
70
+ // args: any[] mirrors the runtime declaration — Move entry-function
71
+ // arguments are heterogeneous primitives validated by the Aptos SDK
72
+ // at submit time.
73
+ call(sender: Account, functionName: string, args: any[]): Promise<TransactionResult>;
77
74
  view<T>(functionName: string, args: any[]): Promise<T>;
78
75
  }
79
76
 
@@ -59,6 +59,14 @@ export interface LocalTestOptions {
59
59
  forkName?: string; // Name for the fork (default: 'test-local')
60
60
  forkPort?: number; // Fork server port (default: 8080)
61
61
  forkResetState?: boolean; // Clear fork state before tests (default: true)
62
+ /**
63
+ * Optional API key sent as `Authorization: Bearer <key>` on every
64
+ * outgoing Movement API request made by the fork's
65
+ * `MovementApiClient`. Use for rate-limited public endpoints or
66
+ * auth-gated nodes. The key stays in process memory only — not
67
+ * persisted to the fork's on-disk metadata.
68
+ */
69
+ forkApiKey?: string;
62
70
 
63
71
  // Common options (both modes)
64
72
  autoFund?: boolean; // Auto-fund accounts (default: true)
package/src/types/fork.ts CHANGED
@@ -37,5 +37,11 @@ export interface AccountData {
37
37
 
38
38
  export interface AccountResource {
39
39
  type: string;
40
- data: any;
40
+ /**
41
+ * Move resource payload — structurally a JSON-shaped object whose
42
+ * schema depends on the resource type (CoinStore, AggregatorSnapshot, etc).
43
+ * unknown forces callers to narrow before access; the boundary-validation
44
+ * follow-up of #57 will add per-resource type guards.
45
+ */
46
+ data: unknown;
41
47
  }
@@ -0,0 +1,182 @@
1
+ import type { DeploymentInfo } from "../core/deployments.js";
2
+ import type { ChildProcessAdapter } from "../utils/childProcessAdapter.js";
3
+
4
+ /**
5
+ * Options for `harness.deployCodeObject(options)`.
6
+ *
7
+ * Wraps `movement move deploy-object`. The Movement CLI derives the
8
+ * destination object address from the signing account; that address is
9
+ * bound to `moduleName` (passed as `--address-name`) at compile time.
10
+ * Callers retrieve the resulting object address via the returned
11
+ * `CodeObjectInfo.address`.
12
+ */
13
+ export interface DeployCodeObjectOptions {
14
+ /**
15
+ * Logical module identifier (the `name` part of `module addr::name`).
16
+ * Used as the persistence key (`deployments/{network}/{moduleName}.json`)
17
+ * and as the `name` arg you'd pass to `runtime.getContract(addr, name)`
18
+ * after deployment.
19
+ *
20
+ * If `addressName` is omitted, `moduleName` is also used as the CLI's
21
+ * `--address-name` flag (correct when the Move.toml's named address
22
+ * matches the module identifier). For packages where they differ —
23
+ * e.g. `module hello_blockchain::counter` (named address
24
+ * `hello_blockchain`, module `counter`) — set `addressName` explicitly.
25
+ */
26
+ moduleName: string;
27
+
28
+ /**
29
+ * Move.toml named address that the derived object address binds to
30
+ * at compile time (the `--address-name` flag of `move deploy-object`).
31
+ *
32
+ * Defaults to `moduleName`. Set this when the Move.toml's named
33
+ * address differs from the on-chain module identifier:
34
+ *
35
+ * ```ts
36
+ * // Move source: `module hello_blockchain::counter`
37
+ * // Move.toml: `[addresses] hello_blockchain = "_"`
38
+ * await harness.deployCodeObject({
39
+ * moduleName: "counter", // for getContract + save key
40
+ * addressName: "hello_blockchain", // for --address-name
41
+ * });
42
+ * ```
43
+ */
44
+ addressName?: string;
45
+
46
+ /**
47
+ * Extra named-address overrides merged on top of the addresses
48
+ * auto-detected from `<packageDir>/sources/**.move`. Values here win
49
+ * for the matching keys; auto-detected names not present here are
50
+ * still pinned to the deployer address (Publisher convention).
51
+ */
52
+ namedAddresses?: Record<string, string>;
53
+
54
+ /**
55
+ * Path to the Move package. Defaults to `config.moveDir` from the
56
+ * harness's runtime config (usually `./move`).
57
+ */
58
+ packageDir?: string;
59
+
60
+ /**
61
+ * Artifact set written into the on-chain package. Mirrors the CLI
62
+ * flag. Defaults to `'sparse'` (the Movement CLI default).
63
+ */
64
+ includedArtifacts?: "none" | "sparse" | "all";
65
+
66
+ /**
67
+ * Test-only override for the child-process adapter. Production callers
68
+ * leave this undefined so the default spawn-based adapter is used.
69
+ * @internal
70
+ */
71
+ adapter?: ChildProcessAdapter;
72
+ }
73
+
74
+ /**
75
+ * Options for `harness.upgradeCodeObject(options)`.
76
+ *
77
+ * Wraps `movement move upgrade-object`. The object must already exist
78
+ * on-chain at `objectAddress` and have been deployed previously (typically
79
+ * via `deployCodeObject`).
80
+ */
81
+ export interface UpgradeCodeObjectOptions extends DeployCodeObjectOptions {
82
+ /** Address of the existing code object to upgrade. Required. */
83
+ objectAddress: string;
84
+ }
85
+
86
+ /**
87
+ * Result of `deployCodeObject` / `upgradeCodeObject`.
88
+ *
89
+ * Today this is structurally identical to {@link DeploymentInfo} — the
90
+ * `address` field holds the derived **object address** (the value
91
+ * callers pass to `runtime.getContract(...)` to interact with the
92
+ * modules), and `deployer` is the signing account.
93
+ *
94
+ * The alias exists so future iterations can layer additional fields
95
+ * (e.g. an explicit `kind: 'code-object' | 'publish'` discriminator)
96
+ * without churning every callsite.
97
+ */
98
+ export type CodeObjectInfo = DeploymentInfo;
99
+
100
+ /**
101
+ * Options for `harness.runViewFunction(options)`.
102
+ *
103
+ * Delegates to the Aptos SDK's `aptos.view(...)` — no CLI invocation,
104
+ * no profile management. Works on `createLocal`, `createFork`, and
105
+ * `createLive` harnesses (view functions are read-only).
106
+ */
107
+ export interface RunViewFunctionOptions {
108
+ /**
109
+ * Fully qualified Move function id, e.g. `0xCAFE::counter::get`.
110
+ */
111
+ function: string;
112
+
113
+ /**
114
+ * Move type-tag arguments, e.g. `['0x1::aptos_coin::AptosCoin']`.
115
+ */
116
+ typeArguments?: string[];
117
+
118
+ /**
119
+ * Move function arguments. SDK-validated at the boundary; pass values
120
+ * matching the Move function signature (strings for `address`,
121
+ * numbers / bigints for `u8`-`u256`, booleans, etc.).
122
+ */
123
+ functionArguments?: unknown[];
124
+ }
125
+
126
+ /**
127
+ * Options for `harness.runMoveScript(options)`.
128
+ *
129
+ * Wraps `movement move run-script`. The CLI handles compilation
130
+ * inline when given a `.move` source; the user can also pass a
131
+ * pre-compiled `.mv` bytecode file.
132
+ *
133
+ * Not available on fork-mode harnesses (forks are read-only).
134
+ */
135
+ export interface RunMoveScriptOptions {
136
+ /**
137
+ * Path to the Move script. Extension determines the CLI flag:
138
+ * - `.move` → `--script-path` (CLI auto-compiles)
139
+ * - `.mv` → `--compiled-script-path` (user pre-compiled)
140
+ * Other extensions throw synchronously before any CLI call.
141
+ */
142
+ scriptPath: string;
143
+
144
+ /**
145
+ * CLI-formatted typed arguments. Movement CLI expects each arg
146
+ * prefixed by its Move type, e.g. `'address:0x1'`, `'u8:42'`,
147
+ * `'bool:true'`, `'string:hello'`. See
148
+ * `movement move run-script --help` for the full grammar.
149
+ */
150
+ args?: string[];
151
+
152
+ /**
153
+ * Type-tag arguments for generic scripts, e.g.
154
+ * `['0x1::aptos_coin::AptosCoin']`.
155
+ */
156
+ typeArgs?: string[];
157
+
158
+ /**
159
+ * Optional working directory for compilation. Most callers leave
160
+ * this undefined — the CLI uses the script's parent directory.
161
+ */
162
+ packageDir?: string;
163
+
164
+ /**
165
+ * Test-only override for the child-process adapter.
166
+ * @internal
167
+ */
168
+ adapter?: ChildProcessAdapter;
169
+ }
170
+
171
+ /**
172
+ * Result of `harness.runMoveScript`.
173
+ *
174
+ * Always carries `txHash` (parser throws if it can't extract one).
175
+ * `success` and `vmStatus` are best-effort: parsed from the CLI's
176
+ * JSON `Result` block when present, `undefined` if the parser misses.
177
+ */
178
+ export interface MoveScriptResult {
179
+ txHash: string;
180
+ success?: boolean;
181
+ vmStatus?: string;
182
+ }
@@ -2,6 +2,7 @@ import { Aptos, Account } from "@aptos-labs/ts-sdk";
2
2
  import { MovehatConfig } from "./config.js";
3
3
  import { MoveContract } from "../core/contract.js";
4
4
  import { DeploymentInfo } from "../core/deployments.js";
5
+ import type { ChildProcessAdapter } from "../utils/childProcessAdapter.js";
5
6
 
6
7
  export interface NetworkInfo {
7
8
  name: string;
@@ -16,7 +17,7 @@ export interface MovehatRuntime {
16
17
  // Network information
17
18
  network: NetworkInfo;
18
19
 
19
- // Aptos client instance
20
+ // Movement TypeScript SDK client instance
20
21
  aptos: Aptos;
21
22
 
22
23
  // Default account from config (accounts[0])
@@ -33,6 +34,11 @@ export interface MovehatRuntime {
33
34
  moduleName: string,
34
35
  options?: {
35
36
  packageDir?: string;
37
+ /**
38
+ * Override the child-process adapter. Test-only: production callers
39
+ * leave this undefined so the default spawn-based adapter is used.
40
+ */
41
+ adapter?: ChildProcessAdapter;
36
42
  }
37
43
  ) => Promise<DeploymentInfo>;
38
44
  getDeployment: (moduleName: string) => DeploymentInfo | null;
@@ -44,6 +50,8 @@ export interface MovehatRuntime {
44
50
  getAccount: (privateKey: string) => Account;
45
51
  getAccountByIndex: (index: number) => Account;
46
52
 
47
- // Network switching
48
- switchNetwork: (networkName: string) => Promise<void>;
53
+ // Network switching — returns a new runtime bound to the requested
54
+ // network. As of M1.5 there is no module-cached runtime, so callers
55
+ // must capture and use the returned instance.
56
+ switchNetwork: (networkName: string) => Promise<MovehatRuntime>;
49
57
  }
@@ -0,0 +1,156 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import {
3
+ shouldUseColor,
4
+ colors,
5
+ rgbToAnsi,
6
+ applyGradient,
7
+ gradients,
8
+ } from '../colors.js';
9
+
10
+ describe('shouldUseColor', () => {
11
+ const originalEnv = process.env;
12
+ const originalIsTTY = process.stdout.isTTY;
13
+
14
+ beforeEach(() => {
15
+ process.env = { ...originalEnv };
16
+ delete process.env.NO_COLOR;
17
+ });
18
+
19
+ afterEach(() => {
20
+ process.env = originalEnv;
21
+ Object.defineProperty(process.stdout, 'isTTY', { value: originalIsTTY });
22
+ });
23
+
24
+ it('should return true when TTY and NO_COLOR not set', () => {
25
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, configurable: true });
26
+ delete process.env.NO_COLOR;
27
+ expect(shouldUseColor()).toBe(true);
28
+ });
29
+
30
+ it('should return false when NO_COLOR is set', () => {
31
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, configurable: true });
32
+ process.env.NO_COLOR = '1';
33
+ expect(shouldUseColor()).toBe(false);
34
+ });
35
+
36
+ it('should return false when not TTY', () => {
37
+ Object.defineProperty(process.stdout, 'isTTY', { value: false, configurable: true });
38
+ delete process.env.NO_COLOR;
39
+ expect(shouldUseColor()).toBe(false);
40
+ });
41
+ });
42
+
43
+ describe('rgbToAnsi', () => {
44
+ it('should generate correct ANSI escape code', () => {
45
+ expect(rgbToAnsi(255, 0, 0)).toBe('\x1b[38;2;255;0;0m');
46
+ expect(rgbToAnsi(0, 255, 0)).toBe('\x1b[38;2;0;255;0m');
47
+ expect(rgbToAnsi(0, 0, 255)).toBe('\x1b[38;2;0;0;255m');
48
+ expect(rgbToAnsi(128, 128, 128)).toBe('\x1b[38;2;128;128;128m');
49
+ });
50
+
51
+ it('should handle edge values', () => {
52
+ expect(rgbToAnsi(0, 0, 0)).toBe('\x1b[38;2;0;0;0m');
53
+ expect(rgbToAnsi(255, 255, 255)).toBe('\x1b[38;2;255;255;255m');
54
+ });
55
+ });
56
+
57
+ describe('applyGradient', () => {
58
+ const originalEnv = process.env;
59
+ const originalIsTTY = process.stdout.isTTY;
60
+
61
+ beforeEach(() => {
62
+ process.env = { ...originalEnv };
63
+ delete process.env.NO_COLOR;
64
+ Object.defineProperty(process.stdout, 'isTTY', { value: true, configurable: true });
65
+ });
66
+
67
+ afterEach(() => {
68
+ process.env = originalEnv;
69
+ Object.defineProperty(process.stdout, 'isTTY', { value: originalIsTTY });
70
+ });
71
+
72
+ it('should apply gradient to text', () => {
73
+ const palette = [[255, 0, 0], [0, 255, 0]] as [number, number, number][];
74
+ const result = applyGradient('AB', palette);
75
+
76
+ expect(result).toContain('\x1b[38;2;255;0;0m'); // Red for 'A'
77
+ expect(result).toContain('\x1b[38;2;0;255;0m'); // Green for 'B'
78
+ expect(result).toContain('A');
79
+ expect(result).toContain('B');
80
+ expect(result).toContain('\x1b[0m'); // Reset at end
81
+ });
82
+
83
+ it('should return plain text when colors disabled', () => {
84
+ process.env.NO_COLOR = '1';
85
+ const palette = [[255, 0, 0]] as [number, number, number][];
86
+ const result = applyGradient('Hello', palette);
87
+
88
+ expect(result).toBe('Hello');
89
+ expect(result).not.toContain('\x1b');
90
+ });
91
+
92
+ it('should cycle through palette for long text', () => {
93
+ const palette = [[255, 0, 0], [0, 255, 0]] as [number, number, number][];
94
+ const result = applyGradient('ABCD', palette);
95
+
96
+ // Should alternate: A=red, B=green, C=red, D=green
97
+ expect(result).toContain('A');
98
+ expect(result).toContain('B');
99
+ expect(result).toContain('C');
100
+ expect(result).toContain('D');
101
+ });
102
+
103
+ it('should handle offset parameter', () => {
104
+ const palette = [[255, 0, 0], [0, 255, 0]] as [number, number, number][];
105
+ const result = applyGradient('AB', palette, 1);
106
+
107
+ // With offset 1: A=green, B=red
108
+ expect(result.indexOf('\x1b[38;2;0;255;0m')).toBeLessThan(result.indexOf('\x1b[38;2;255;0;0m'));
109
+ });
110
+ });
111
+
112
+ describe('gradients', () => {
113
+ it('should have movehat gradient with 5 colors', () => {
114
+ expect(gradients.movehat).toHaveLength(5);
115
+ gradients.movehat.forEach(([r, g, b]) => {
116
+ expect(r).toBeGreaterThanOrEqual(0);
117
+ expect(r).toBeLessThanOrEqual(255);
118
+ expect(g).toBeGreaterThanOrEqual(0);
119
+ expect(g).toBeLessThanOrEqual(255);
120
+ expect(b).toBeGreaterThanOrEqual(0);
121
+ expect(b).toBeLessThanOrEqual(255);
122
+ });
123
+ });
124
+
125
+ it('should have success gradient', () => {
126
+ expect(gradients.success).toBeDefined();
127
+ expect(gradients.success.length).toBeGreaterThan(0);
128
+ });
129
+
130
+ it('should have error gradient', () => {
131
+ expect(gradients.error).toBeDefined();
132
+ expect(gradients.error.length).toBeGreaterThan(0);
133
+ });
134
+ });
135
+
136
+ describe('colors object', () => {
137
+ it('should have all semantic color functions', () => {
138
+ expect(typeof colors.success).toBe('function');
139
+ expect(typeof colors.error).toBe('function');
140
+ expect(typeof colors.warning).toBe('function');
141
+ expect(typeof colors.info).toBe('function');
142
+ expect(typeof colors.primary).toBe('function');
143
+ expect(typeof colors.secondary).toBe('function');
144
+ expect(typeof colors.muted).toBe('function');
145
+ expect(typeof colors.dim).toBe('function');
146
+ expect(typeof colors.bold).toBe('function');
147
+ expect(typeof colors.brand).toBe('function');
148
+ expect(typeof colors.brandBright).toBe('function');
149
+ });
150
+
151
+ it('should return strings when called', () => {
152
+ expect(typeof colors.success('test')).toBe('string');
153
+ expect(typeof colors.error('test')).toBe('string');
154
+ expect(typeof colors.brand('test')).toBe('string');
155
+ });
156
+ });
package/src/ui/colors.ts CHANGED
@@ -86,8 +86,11 @@ export const applyGradient = (
86
86
  let result = '';
87
87
  for (let i = 0; i < text.length; i++) {
88
88
  const colorIndex = (i + offset) % palette.length;
89
- const [r, g, b] = palette[colorIndex];
90
- result += `${rgbToAnsi(r, g, b)}${text[i]}`;
89
+ const color = palette[colorIndex];
90
+ const ch = text[i];
91
+ if (!color || ch === undefined) continue;
92
+ const [r, g, b] = color;
93
+ result += `${rgbToAnsi(r, g, b)}${ch}`;
91
94
  }
92
95
  return result + '\x1b[0m';
93
96
  };
package/src/ui/logger.ts CHANGED
@@ -119,6 +119,27 @@ export const warning = (message: string, indent: number = 0): void => {
119
119
  console.warn(`${coloredSymbol('warning')} ${formatted}`);
120
120
  };
121
121
 
122
+ /**
123
+ * Action / progress message (dim chevron prefix)
124
+ * Use for in-progress action lines like "Building package", "Publishing
125
+ * to blockchain" — anything that's a status update during a multi-step
126
+ * operation. Distinct from `info` (general updates) and `success`
127
+ * (completion).
128
+ *
129
+ * @param message - Message to log
130
+ * @param indent - Number of spaces to indent (default: 0)
131
+ *
132
+ * @example
133
+ * logger.step('Building package...');
134
+ * logger.step('Publishing to blockchain...');
135
+ * logger.success('Module published successfully!');
136
+ */
137
+ export const step = (message: string, indent: number = 0): void => {
138
+ if (config.silent) return;
139
+ const formatted = formatMessage(message, indent);
140
+ console.log(`${colors.dim(symbols.step)} ${formatted}`);
141
+ };
142
+
122
143
  /**
123
144
  * Plain message without symbol
124
145
  * Use for continuation lines or when symbol is not appropriate
@@ -218,6 +239,7 @@ export const logger = {
218
239
  success,
219
240
  error,
220
241
  warning,
242
+ step,
221
243
  plain,
222
244
  newline,
223
245
  section,
package/src/ui/symbols.ts CHANGED
@@ -16,7 +16,13 @@ export const symbols = {
16
16
  warning: figures.warning, // ⚠ or ‼
17
17
  info: figures.info, // ℹ or i
18
18
 
19
- // Action symbols
19
+ // Action / progress symbols
20
+ step: '▸', // ▸ — used to prefix in-progress action lines
21
+ // (e.g. "▸ Building package"). Plain Unicode
22
+ // BLACK RIGHT-POINTING SMALL TRIANGLE, supported
23
+ // in every UTF-8 terminal. If a non-UTF-8
24
+ // environment ever surfaces, switch to
25
+ // figures.pointerSmall ('›' with ASCII fallback).
20
26
  pointer: figures.pointer, // ❯ or >
21
27
  checkboxOn: figures.checkboxOn, // ☑ or [×]
22
28
  checkboxOff: figures.checkboxOff, // ☐ or [ ]
@@ -0,0 +1,93 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ isHexAddress,
4
+ normalizeAddress,
5
+ normalizeAddressShort,
6
+ } from '../address.js';
7
+
8
+ const PADDED_ONE = '0x' + '0'.repeat(63) + '1';
9
+ const PADDED_DEAD = '0x' + '0'.repeat(60) + 'dead';
10
+
11
+ describe('normalizeAddress', () => {
12
+ it('pads a short hex to 64 chars and adds 0x', () => {
13
+ expect(normalizeAddress('1')).toBe(PADDED_ONE);
14
+ });
15
+
16
+ it('preserves a fully padded address', () => {
17
+ const full = '0x' + 'a'.repeat(64);
18
+ expect(normalizeAddress(full)).toBe(full);
19
+ });
20
+
21
+ it('lowercases mixed-case input', () => {
22
+ expect(normalizeAddress('0xDEAD')).toBe(PADDED_DEAD);
23
+ });
24
+
25
+ it('adds the 0x prefix when missing', () => {
26
+ expect(normalizeAddress('dead')).toBe(PADDED_DEAD);
27
+ });
28
+
29
+ it('returns 0x followed by 64 zeros for empty input', () => {
30
+ expect(normalizeAddress('')).toBe('0x' + '0'.repeat(64));
31
+ });
32
+
33
+ it('matches fork/manager.ts legacy semantics for the canonical case', () => {
34
+ // Mirrors the inline `private normalizeAddress` from fork/manager.ts:243.
35
+ expect(normalizeAddress('0X1')).toBe(PADDED_ONE);
36
+ });
37
+ });
38
+
39
+ describe('normalizeAddressShort', () => {
40
+ it('adds 0x and lowercases without padding', () => {
41
+ expect(normalizeAddressShort('DEAD')).toBe('0xdead');
42
+ });
43
+
44
+ it('preserves the 0x prefix when already present', () => {
45
+ expect(normalizeAddressShort('0xBeef')).toBe('0xbeef');
46
+ });
47
+
48
+ it('does not pad a short address', () => {
49
+ expect(normalizeAddressShort('1')).toBe('0x1');
50
+ });
51
+
52
+ it('returns just 0x for empty input', () => {
53
+ expect(normalizeAddressShort('')).toBe('0x');
54
+ });
55
+ });
56
+
57
+ describe('isHexAddress', () => {
58
+ it('accepts short hex with 0x prefix', () => {
59
+ expect(isHexAddress('0x1')).toBe(true);
60
+ });
61
+
62
+ it('accepts hex without 0x prefix', () => {
63
+ expect(isHexAddress('dead')).toBe(true);
64
+ });
65
+
66
+ it('accepts uppercase 0X prefix', () => {
67
+ expect(isHexAddress('0Xabc')).toBe(true);
68
+ });
69
+
70
+ it('accepts a full 64-char address', () => {
71
+ expect(isHexAddress('0x' + 'f'.repeat(64))).toBe(true);
72
+ });
73
+
74
+ it('rejects empty string', () => {
75
+ expect(isHexAddress('')).toBe(false);
76
+ });
77
+
78
+ it('rejects lone 0x with no hex', () => {
79
+ expect(isHexAddress('0x')).toBe(false);
80
+ });
81
+
82
+ it('rejects non-hex characters', () => {
83
+ expect(isHexAddress('0xghij')).toBe(false);
84
+ });
85
+
86
+ it('rejects input longer than 64 hex chars', () => {
87
+ expect(isHexAddress('0x' + '0'.repeat(65))).toBe(false);
88
+ });
89
+
90
+ it('accepts mixed case hex', () => {
91
+ expect(isHexAddress('0xAbCdEf')).toBe(true);
92
+ });
93
+ });