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,385 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+
6
+ /**
7
+ * Tests for `ForkManager` (M3.3). Strategy:
8
+ * - `vi.mock` the upstream `MovementApiClient` (network layer) so
9
+ * tests stay offline and deterministic.
10
+ * - Use a REAL `ForkStorage` against a tmpdir (storage is already
11
+ * covered at ~85% by its own suite; we treat it as a trusted
12
+ * dependency here and assert the manager's lifecycle on top of it).
13
+ */
14
+
15
+ // Module-scoped fakes — populated per test via setMockApi() below.
16
+ const fakeApi = {
17
+ getLedgerInfo: vi.fn(),
18
+ getAccount: vi.fn(),
19
+ getAccountResource: vi.fn(),
20
+ getAccountResources: vi.fn(),
21
+ };
22
+
23
+ // Track the (nodeUrl, apiKey) pair every constructor call sees, so we
24
+ // can assert setApiKey reconstructs the client.
25
+ const apiCtorCalls: Array<{ nodeUrl: string; apiKey?: string | undefined }> = [];
26
+
27
+ vi.mock("../api.js", () => ({
28
+ MovementApiClient: class {
29
+ constructor(nodeUrl: string, apiKey?: string) {
30
+ apiCtorCalls.push({ nodeUrl, apiKey });
31
+ }
32
+ getLedgerInfo = fakeApi.getLedgerInfo;
33
+ getAccount = fakeApi.getAccount;
34
+ getAccountResource = fakeApi.getAccountResource;
35
+ getAccountResources = fakeApi.getAccountResources;
36
+ },
37
+ }));
38
+
39
+ // Static import after the mock declaration — vi hoists vi.mock calls.
40
+ import { ForkManager } from "../manager.js";
41
+
42
+ const TEST_NODE_URL = "https://testnet.movementnetwork.xyz/v1";
43
+ const TEST_ADDR = "0x" + "a".repeat(64);
44
+ const COIN_TYPE = "0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>";
45
+
46
+ function ledgerInfoFixture() {
47
+ return {
48
+ chain_id: 27,
49
+ ledger_version: "100",
50
+ ledger_timestamp: "1234567890",
51
+ epoch: "5",
52
+ block_height: "42",
53
+ };
54
+ }
55
+
56
+ describe("ForkManager — initialize / load", () => {
57
+ let tmpDir: string;
58
+ let forkPath: string;
59
+
60
+ beforeEach(() => {
61
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-forkmgr-"));
62
+ forkPath = join(tmpDir, "fork");
63
+ apiCtorCalls.length = 0;
64
+ fakeApi.getLedgerInfo.mockReset();
65
+ fakeApi.getAccount.mockReset();
66
+ fakeApi.getAccountResource.mockReset();
67
+ fakeApi.getAccountResources.mockReset();
68
+ vi.spyOn(console, "log").mockImplementation(() => undefined);
69
+ });
70
+
71
+ afterEach(() => {
72
+ vi.restoreAllMocks();
73
+ rmSync(tmpDir, { recursive: true, force: true });
74
+ });
75
+
76
+ it("initialize writes metadata and constructs an API client without apiKey by default", async () => {
77
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
78
+ const mgr = new ForkManager(forkPath);
79
+
80
+ await mgr.initialize(TEST_NODE_URL);
81
+
82
+ expect(apiCtorCalls).toHaveLength(1);
83
+ expect(apiCtorCalls[0]?.nodeUrl).toBe(TEST_NODE_URL);
84
+ expect(apiCtorCalls[0]?.apiKey).toBeUndefined();
85
+
86
+ const meta = mgr.getMetadata();
87
+ expect(meta.network).toBe("custom");
88
+ expect(meta.nodeUrl).toBe(TEST_NODE_URL);
89
+ expect(meta.chainId).toBe(27);
90
+ expect(meta.ledgerVersion).toBe("100");
91
+ });
92
+
93
+ it("initialize passes apiKey through to the API client", async () => {
94
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
95
+ const mgr = new ForkManager(forkPath);
96
+
97
+ await mgr.initialize(TEST_NODE_URL, "testnet", "secret-key");
98
+
99
+ expect(apiCtorCalls).toHaveLength(1);
100
+ expect(apiCtorCalls[0]?.apiKey).toBe("secret-key");
101
+ });
102
+
103
+ it("initialize labels the fork with the provided networkName", async () => {
104
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
105
+ const mgr = new ForkManager(forkPath);
106
+
107
+ await mgr.initialize(TEST_NODE_URL, "bardock-testnet");
108
+
109
+ expect(mgr.getMetadata().network).toBe("bardock-testnet");
110
+ });
111
+
112
+ it("load throws when the fork directory doesn't exist", () => {
113
+ const mgr = new ForkManager(forkPath);
114
+ expect(() => mgr.load()).toThrow(/Fork does not exist/);
115
+ });
116
+
117
+ it("load restores metadata from disk and reconstructs the API client", async () => {
118
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
119
+ const first = new ForkManager(forkPath);
120
+ await first.initialize(TEST_NODE_URL);
121
+
122
+ apiCtorCalls.length = 0;
123
+
124
+ const reloaded = new ForkManager(forkPath);
125
+ reloaded.load();
126
+
127
+ expect(apiCtorCalls).toHaveLength(1);
128
+ expect(reloaded.getMetadata().nodeUrl).toBe(TEST_NODE_URL);
129
+ });
130
+
131
+ it("setApiKey reconstructs the API client when one already exists", async () => {
132
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
133
+ const mgr = new ForkManager(forkPath);
134
+ await mgr.initialize(TEST_NODE_URL);
135
+
136
+ apiCtorCalls.length = 0;
137
+ mgr.setApiKey("new-key");
138
+
139
+ expect(apiCtorCalls).toHaveLength(1);
140
+ expect(apiCtorCalls[0]?.apiKey).toBe("new-key");
141
+ });
142
+
143
+ it("setApiKey(undefined) clears the key on the next reconstruction", async () => {
144
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
145
+ const mgr = new ForkManager(forkPath);
146
+ await mgr.initialize(TEST_NODE_URL, "custom", "key");
147
+
148
+ apiCtorCalls.length = 0;
149
+ mgr.setApiKey(undefined);
150
+
151
+ expect(apiCtorCalls).toHaveLength(1);
152
+ expect(apiCtorCalls[0]?.apiKey).toBeUndefined();
153
+ });
154
+
155
+ it("setApiKey is a no-op before initialize/load (no client yet)", () => {
156
+ const mgr = new ForkManager(forkPath);
157
+ apiCtorCalls.length = 0;
158
+ mgr.setApiKey("key");
159
+ expect(apiCtorCalls).toHaveLength(0);
160
+ });
161
+ });
162
+
163
+ describe("ForkManager — account + resource fetch", () => {
164
+ let tmpDir: string;
165
+ let forkPath: string;
166
+ let mgr: ForkManager;
167
+
168
+ beforeEach(async () => {
169
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-forkmgr-"));
170
+ forkPath = join(tmpDir, "fork");
171
+ apiCtorCalls.length = 0;
172
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
173
+ fakeApi.getAccount.mockReset();
174
+ fakeApi.getAccountResource.mockReset();
175
+ fakeApi.getAccountResources.mockReset();
176
+ vi.spyOn(console, "log").mockImplementation(() => undefined);
177
+
178
+ mgr = new ForkManager(forkPath);
179
+ await mgr.initialize(TEST_NODE_URL);
180
+ });
181
+
182
+ afterEach(() => {
183
+ vi.restoreAllMocks();
184
+ rmSync(tmpDir, { recursive: true, force: true });
185
+ });
186
+
187
+ it("getAccount fetches from API and caches in storage on first call", async () => {
188
+ fakeApi.getAccount.mockResolvedValue({
189
+ sequence_number: "7",
190
+ authentication_key: "0xabc",
191
+ });
192
+
193
+ const state = await mgr.getAccount(TEST_ADDR);
194
+ expect(state.sequenceNumber).toBe("7");
195
+ expect(state.authenticationKey).toBe("0xabc");
196
+ expect(fakeApi.getAccount).toHaveBeenCalledTimes(1);
197
+ });
198
+
199
+ it("getAccount returns the cached state on second call (no extra API hit)", async () => {
200
+ fakeApi.getAccount.mockResolvedValue({
201
+ sequence_number: "7",
202
+ authentication_key: "0xabc",
203
+ });
204
+
205
+ await mgr.getAccount(TEST_ADDR);
206
+ await mgr.getAccount(TEST_ADDR);
207
+
208
+ expect(fakeApi.getAccount).toHaveBeenCalledTimes(1);
209
+ });
210
+
211
+ it("getAccount throws if the manager was never initialized/loaded", async () => {
212
+ const fresh = new ForkManager(join(tmpDir, "uninitialized"));
213
+ await expect(fresh.getAccount(TEST_ADDR)).rejects.toThrow(
214
+ /Fork not initialized/
215
+ );
216
+ });
217
+
218
+ it("getResource fetches and caches by resource type", async () => {
219
+ fakeApi.getAccountResource.mockResolvedValue({
220
+ data: { value: "42" },
221
+ });
222
+
223
+ const r1 = await mgr.getResource(TEST_ADDR, "0x1::counter::Counter");
224
+ expect(r1).toEqual({ value: "42" });
225
+ const r2 = await mgr.getResource(TEST_ADDR, "0x1::counter::Counter");
226
+ expect(r2).toEqual({ value: "42" });
227
+ expect(fakeApi.getAccountResource).toHaveBeenCalledTimes(1);
228
+ });
229
+
230
+ it("getResource rethrows a clean 'not found' for upstream 404 errors", async () => {
231
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
232
+ await expect(
233
+ mgr.getResource(TEST_ADDR, "0x1::missing::Resource")
234
+ ).rejects.toThrow(/Resource .* not found for account/);
235
+ });
236
+
237
+ it("getResource rethrows other errors unchanged", async () => {
238
+ fakeApi.getAccountResource.mockRejectedValue(new Error("connection refused"));
239
+ await expect(
240
+ mgr.getResource(TEST_ADDR, "0x1::missing::Resource")
241
+ ).rejects.toThrow(/connection refused/);
242
+ });
243
+
244
+ it("getAllResources fetches the whole list once, caches, and returns by type", async () => {
245
+ fakeApi.getAccountResources.mockResolvedValue([
246
+ { type: "0x1::a::A", data: { x: 1 } },
247
+ { type: "0x1::b::B", data: { y: 2 } },
248
+ ]);
249
+
250
+ const first = await mgr.getAllResources(TEST_ADDR);
251
+ expect(Object.keys(first).sort()).toEqual(["0x1::a::A", "0x1::b::B"]);
252
+ expect(first["0x1::a::A"]).toEqual({ x: 1 });
253
+
254
+ // Second call should hit cache (API call count stays at 1).
255
+ await mgr.getAllResources(TEST_ADDR);
256
+ expect(fakeApi.getAccountResources).toHaveBeenCalledTimes(1);
257
+ });
258
+ });
259
+
260
+ describe("ForkManager — fundAccount / setResource / list / getOrCreateAccount", () => {
261
+ let tmpDir: string;
262
+ let forkPath: string;
263
+ let mgr: ForkManager;
264
+
265
+ beforeEach(async () => {
266
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-forkmgr-"));
267
+ forkPath = join(tmpDir, "fork");
268
+ apiCtorCalls.length = 0;
269
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
270
+ fakeApi.getAccount.mockReset();
271
+ fakeApi.getAccountResource.mockReset();
272
+ fakeApi.getAccountResources.mockReset();
273
+ vi.spyOn(console, "log").mockImplementation(() => undefined);
274
+
275
+ mgr = new ForkManager(forkPath);
276
+ await mgr.initialize(TEST_NODE_URL);
277
+ });
278
+
279
+ afterEach(() => {
280
+ vi.restoreAllMocks();
281
+ rmSync(tmpDir, { recursive: true, force: true });
282
+ });
283
+
284
+ it("fundAccount creates a fresh CoinStore when none exists upstream", async () => {
285
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
286
+
287
+ await mgr.fundAccount(TEST_ADDR, 1_000);
288
+
289
+ // Now the resource should be in cache — read it back without another API hit.
290
+ fakeApi.getAccountResource.mockClear();
291
+ const stored = await mgr.getResource(TEST_ADDR, COIN_TYPE);
292
+ expect(stored).toBeDefined();
293
+ expect(stored.coin.value).toBe("1000");
294
+ expect(fakeApi.getAccountResource).not.toHaveBeenCalled();
295
+ });
296
+
297
+ it("fundAccount adds to existing balance on a second call (accumulates)", async () => {
298
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
299
+ await mgr.fundAccount(TEST_ADDR, 1_000);
300
+ await mgr.fundAccount(TEST_ADDR, 500);
301
+
302
+ const stored = await mgr.getResource(TEST_ADDR, COIN_TYPE);
303
+ expect(stored.coin.value).toBe("1500");
304
+ });
305
+
306
+ it("fundAccount rethrows non-404 errors from getResource", async () => {
307
+ fakeApi.getAccountResource.mockRejectedValue(new Error("upstream is angry"));
308
+ await expect(mgr.fundAccount(TEST_ADDR, 100)).rejects.toThrow(/upstream is angry/);
309
+ });
310
+
311
+ it("fundMultipleAccounts funds every address in the list", async () => {
312
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
313
+
314
+ const addrs = [
315
+ "0x" + "1".repeat(64),
316
+ "0x" + "2".repeat(64),
317
+ "0x" + "3".repeat(64),
318
+ ];
319
+ await mgr.fundMultipleAccounts(addrs, 500);
320
+
321
+ // Each address now has a 500-balance CoinStore in cache.
322
+ fakeApi.getAccountResource.mockClear();
323
+ for (const addr of addrs) {
324
+ const stored = await mgr.getResource(addr, COIN_TYPE);
325
+ expect(stored.coin.value).toBe("500");
326
+ }
327
+ expect(fakeApi.getAccountResource).not.toHaveBeenCalled();
328
+ });
329
+
330
+ it("setResource overwrites a cached resource", async () => {
331
+ await mgr.setResource(TEST_ADDR, "0x1::custom::Resource", { value: 1 });
332
+ await mgr.setResource(TEST_ADDR, "0x1::custom::Resource", { value: 2 });
333
+ const stored = await mgr.getResource(TEST_ADDR, "0x1::custom::Resource");
334
+ expect(stored).toEqual({ value: 2 });
335
+ });
336
+
337
+ it("listAccounts returns the cached account list", async () => {
338
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
339
+ await mgr.fundAccount(TEST_ADDR, 100);
340
+ const list = mgr.listAccounts();
341
+ expect(list.length).toBeGreaterThan(0);
342
+ });
343
+
344
+ it("getOrCreateAccount returns the existing account when one is cached", async () => {
345
+ fakeApi.getAccount.mockResolvedValue({
346
+ sequence_number: "0",
347
+ authentication_key: "0xabc",
348
+ });
349
+ await mgr.getAccount(TEST_ADDR);
350
+ fakeApi.getAccount.mockClear();
351
+
352
+ const result = await mgr.getOrCreateAccount(TEST_ADDR);
353
+ expect(result.authenticationKey).toBe("0xabc");
354
+ expect(fakeApi.getAccount).not.toHaveBeenCalled();
355
+ });
356
+
357
+ it("getOrCreateAccount synthesizes a minimal account when the upstream lookup fails", async () => {
358
+ // Force the storage cache miss AND the API throw, exercising the
359
+ // catch arm that creates the account locally.
360
+ fakeApi.getAccount.mockRejectedValue(new Error("HTTP 404: not found"));
361
+
362
+ const result = await mgr.getOrCreateAccount(TEST_ADDR);
363
+ expect(result.sequenceNumber).toBe("0");
364
+ expect(result.authenticationKey).toHaveLength(66);
365
+ });
366
+
367
+ it("resetState clears cached accounts and resources", async () => {
368
+ fakeApi.getAccount.mockResolvedValue({
369
+ sequence_number: "5",
370
+ authentication_key: "0xabc",
371
+ });
372
+ await mgr.getAccount(TEST_ADDR);
373
+
374
+ await mgr.resetState();
375
+
376
+ fakeApi.getAccount.mockClear();
377
+ fakeApi.getAccount.mockResolvedValue({
378
+ sequence_number: "5",
379
+ authentication_key: "0xabc",
380
+ });
381
+ // After reset, fetching again should hit the API (not the cache).
382
+ await mgr.getAccount(TEST_ADDR);
383
+ expect(fakeApi.getAccount).toHaveBeenCalledTimes(1);
384
+ });
385
+ });
@@ -0,0 +1,65 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from "fs";
3
+ import { tmpdir } from "os";
4
+ import { join } from "path";
5
+ import { AddressInfo } from "net";
6
+ import { ForkServer } from "../server.js";
7
+
8
+ /**
9
+ * Helper to set up a minimal fork directory so ForkServer.start() succeeds.
10
+ */
11
+ function makeForkDir(): string {
12
+ const dir = mkdtempSync(join(tmpdir(), "movehat-fork-server-"));
13
+ mkdirSync(join(dir, "resources"), { recursive: true });
14
+ writeFileSync(
15
+ join(dir, "metadata.json"),
16
+ JSON.stringify({
17
+ network: "test",
18
+ nodeUrl: "http://example.invalid/v1",
19
+ chainId: 0,
20
+ ledgerVersion: "0",
21
+ timestamp: "0",
22
+ epoch: "0",
23
+ blockHeight: "0",
24
+ createdAt: new Date().toISOString(),
25
+ }),
26
+ );
27
+ writeFileSync(join(dir, "accounts.json"), "{}");
28
+ return dir;
29
+ }
30
+
31
+ describe("ForkServer", () => {
32
+ let forkDir: string;
33
+ let server: ForkServer | null = null;
34
+
35
+ beforeEach(() => {
36
+ forkDir = makeForkDir();
37
+ });
38
+
39
+ afterEach(async () => {
40
+ if (server) {
41
+ await server.stop();
42
+ server = null;
43
+ }
44
+ rmSync(forkDir, { recursive: true, force: true });
45
+ });
46
+
47
+ it("binds to 127.0.0.1 by default", async () => {
48
+ // Port 0 lets the OS pick a free port.
49
+ server = new ForkServer(forkDir, 0);
50
+ await server.start();
51
+
52
+ const internal = (server as unknown as { server: { address(): AddressInfo } }).server;
53
+ const addr = internal.address();
54
+ expect(addr.address).toBe("127.0.0.1");
55
+ });
56
+
57
+ it("respects a custom host argument (::1)", async () => {
58
+ server = new ForkServer(forkDir, 0, "::1");
59
+ await server.start();
60
+
61
+ const internal = (server as unknown as { server: { address(): AddressInfo } }).server;
62
+ const addr = internal.address();
63
+ expect(addr.address).toBe("::1");
64
+ });
65
+ });