movehat 0.1.9 → 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.
- package/README.md +2 -2
- package/dist/__tests__/deployContract.test.d.ts +2 -0
- package/dist/__tests__/deployContract.test.d.ts.map +1 -0
- package/dist/__tests__/deployContract.test.js +368 -0
- package/dist/__tests__/deployContract.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +46 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +24 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +1 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.js +82 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +1 -0
- package/dist/__tests__/fork/api.test.d.ts +2 -0
- package/dist/__tests__/fork/api.test.d.ts.map +1 -0
- package/dist/__tests__/fork/api.test.js +110 -0
- package/dist/__tests__/fork/api.test.js.map +1 -0
- package/dist/__tests__/harness/Harness.createLive.test.d.ts +2 -0
- package/dist/__tests__/harness/Harness.createLive.test.d.ts.map +1 -0
- package/dist/__tests__/harness/Harness.createLive.test.js +53 -0
- package/dist/__tests__/harness/Harness.createLive.test.js.map +1 -0
- package/dist/__tests__/harness/Harness.proxy.test.d.ts +2 -0
- package/dist/__tests__/harness/Harness.proxy.test.d.ts.map +1 -0
- package/dist/__tests__/harness/Harness.proxy.test.js +93 -0
- package/dist/__tests__/harness/Harness.proxy.test.js.map +1 -0
- package/dist/__tests__/harness/_fixture.d.ts +54 -0
- package/dist/__tests__/harness/_fixture.d.ts.map +1 -0
- package/dist/__tests__/harness/_fixture.js +69 -0
- package/dist/__tests__/harness/_fixture.js.map +1 -0
- package/dist/__tests__/harness/codeObject.deploy.test.d.ts +2 -0
- package/dist/__tests__/harness/codeObject.deploy.test.d.ts.map +1 -0
- package/dist/__tests__/harness/codeObject.deploy.test.js +288 -0
- package/dist/__tests__/harness/codeObject.deploy.test.js.map +1 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.d.ts +2 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.js +138 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.js.map +1 -0
- package/dist/__tests__/harness/script.test.d.ts +2 -0
- package/dist/__tests__/harness/script.test.d.ts.map +1 -0
- package/dist/__tests__/harness/script.test.js +219 -0
- package/dist/__tests__/harness/script.test.js.map +1 -0
- package/dist/__tests__/harness/view.test.d.ts +2 -0
- package/dist/__tests__/harness/view.test.d.ts.map +1 -0
- package/dist/__tests__/harness/view.test.js +92 -0
- package/dist/__tests__/harness/view.test.js.map +1 -0
- package/dist/__tests__/runtime.test.d.ts +2 -0
- package/dist/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/runtime.test.js +141 -0
- package/dist/__tests__/runtime.test.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/compile.test.d.ts +2 -0
- package/dist/commands/__tests__/compile.test.d.ts.map +1 -0
- package/dist/commands/__tests__/compile.test.js +351 -0
- package/dist/commands/__tests__/compile.test.js.map +1 -0
- package/dist/commands/__tests__/init.test.d.ts +2 -0
- package/dist/commands/__tests__/init.test.d.ts.map +1 -0
- package/dist/commands/__tests__/init.test.js +101 -0
- package/dist/commands/__tests__/init.test.js.map +1 -0
- package/dist/commands/__tests__/run.test.d.ts +2 -0
- package/dist/commands/__tests__/run.test.d.ts.map +1 -0
- package/dist/commands/__tests__/run.test.js +166 -0
- package/dist/commands/__tests__/run.test.js.map +1 -0
- package/dist/commands/__tests__/test-move.test.d.ts +2 -0
- package/dist/commands/__tests__/test-move.test.d.ts.map +1 -0
- package/dist/commands/__tests__/test-move.test.js +59 -0
- package/dist/commands/__tests__/test-move.test.js.map +1 -0
- package/dist/commands/__tests__/test.test.d.ts +2 -0
- package/dist/commands/__tests__/test.test.d.ts.map +1 -0
- package/dist/commands/__tests__/test.test.js +168 -0
- package/dist/commands/__tests__/test.test.js.map +1 -0
- package/dist/commands/__tests__/update.test.d.ts +2 -0
- package/dist/commands/__tests__/update.test.d.ts.map +1 -0
- package/dist/commands/__tests__/update.test.js +176 -0
- package/dist/commands/__tests__/update.test.js.map +1 -0
- package/dist/commands/compile.d.ts +7 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +150 -33
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/fork/__tests__/create.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/create.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/create.test.js +108 -0
- package/dist/commands/fork/__tests__/create.test.js.map +1 -0
- package/dist/commands/fork/__tests__/fund.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/fund.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/fund.test.js +72 -0
- package/dist/commands/fork/__tests__/fund.test.js.map +1 -0
- package/dist/commands/fork/__tests__/list.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/list.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/list.test.js +119 -0
- package/dist/commands/fork/__tests__/list.test.js.map +1 -0
- package/dist/commands/fork/__tests__/serve.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/serve.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/serve.test.js +97 -0
- package/dist/commands/fork/__tests__/serve.test.js.map +1 -0
- package/dist/commands/fork/__tests__/view-resource.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/view-resource.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/view-resource.test.js +77 -0
- package/dist/commands/fork/__tests__/view-resource.test.js.map +1 -0
- package/dist/commands/fork/create.d.ts +1 -1
- package/dist/commands/fork/create.d.ts.map +1 -1
- package/dist/commands/fork/create.js +3 -2
- package/dist/commands/fork/create.js.map +1 -1
- package/dist/commands/fork/fund.d.ts.map +1 -1
- package/dist/commands/fork/fund.js +15 -8
- package/dist/commands/fork/fund.js.map +1 -1
- package/dist/commands/fork/list.d.ts.map +1 -1
- package/dist/commands/fork/list.js +2 -1
- package/dist/commands/fork/list.js.map +1 -1
- package/dist/commands/fork/serve.d.ts +1 -0
- package/dist/commands/fork/serve.d.ts.map +1 -1
- package/dist/commands/fork/serve.js +4 -2
- package/dist/commands/fork/serve.js.map +1 -1
- package/dist/commands/fork/view-resource.d.ts.map +1 -1
- package/dist/commands/fork/view-resource.js +10 -5
- package/dist/commands/fork/view-resource.js.map +1 -1
- package/dist/commands/run.d.ts +15 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +50 -27
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/test-move.d.ts.map +1 -1
- package/dist/commands/test-move.js +3 -2
- package/dist/commands/test-move.js.map +1 -1
- package/dist/commands/test.js +52 -46
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +15 -13
- package/dist/commands/update.js.map +1 -1
- package/dist/core/AccountManager.d.ts +1 -1
- package/dist/core/AccountManager.d.ts.map +1 -1
- package/dist/core/AccountManager.js +20 -7
- package/dist/core/AccountManager.js.map +1 -1
- package/dist/core/Publisher.d.ts +31 -0
- package/dist/core/Publisher.d.ts.map +1 -0
- package/dist/core/Publisher.js +248 -0
- package/dist/core/Publisher.js.map +1 -0
- package/dist/core/__tests__/AccountManager.test.d.ts +2 -0
- package/dist/core/__tests__/AccountManager.test.d.ts.map +1 -0
- package/dist/core/__tests__/AccountManager.test.js +239 -0
- package/dist/core/__tests__/AccountManager.test.js.map +1 -0
- package/dist/core/__tests__/config.test.d.ts +2 -0
- package/dist/core/__tests__/config.test.d.ts.map +1 -0
- package/dist/core/__tests__/config.test.js +311 -0
- package/dist/core/__tests__/config.test.js.map +1 -0
- package/dist/core/__tests__/deployments.test.d.ts +2 -0
- package/dist/core/__tests__/deployments.test.d.ts.map +1 -0
- package/dist/core/__tests__/deployments.test.js +201 -0
- package/dist/core/__tests__/deployments.test.js.map +1 -0
- package/dist/core/__tests__/shell.test.d.ts +2 -0
- package/dist/core/__tests__/shell.test.d.ts.map +1 -0
- package/dist/core/__tests__/shell.test.js +107 -0
- package/dist/core/__tests__/shell.test.js.map +1 -0
- package/dist/core/config.d.ts +13 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +80 -11
- package/dist/core/config.js.map +1 -1
- package/dist/core/contract.d.ts +1 -1
- package/dist/core/contract.d.ts.map +1 -1
- package/dist/core/contract.js +15 -4
- package/dist/core/contract.js.map +1 -1
- package/dist/core/deployments.d.ts +2 -2
- package/dist/core/deployments.d.ts.map +1 -1
- package/dist/core/deployments.js +8 -6
- package/dist/core/deployments.js.map +1 -1
- package/dist/core/movementProfile.d.ts +34 -0
- package/dist/core/movementProfile.d.ts.map +1 -0
- package/dist/core/movementProfile.js +150 -0
- package/dist/core/movementProfile.js.map +1 -0
- package/dist/core/shell.d.ts +23 -7
- package/dist/core/shell.d.ts.map +1 -1
- package/dist/core/shell.js +32 -14
- package/dist/core/shell.js.map +1 -1
- package/dist/errors.d.ts +35 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +54 -0
- package/dist/errors.js.map +1 -1
- package/dist/fork/__tests__/manager.test.d.ts +2 -0
- package/dist/fork/__tests__/manager.test.d.ts.map +1 -0
- package/dist/fork/__tests__/manager.test.js +309 -0
- package/dist/fork/__tests__/manager.test.js.map +1 -0
- package/dist/fork/__tests__/server.test.d.ts +2 -0
- package/dist/fork/__tests__/server.test.d.ts.map +1 -0
- package/dist/fork/__tests__/server.test.js +54 -0
- package/dist/fork/__tests__/server.test.js.map +1 -0
- package/dist/fork/__tests__/storage.test.d.ts +2 -0
- package/dist/fork/__tests__/storage.test.d.ts.map +1 -0
- package/dist/fork/__tests__/storage.test.js +222 -0
- package/dist/fork/__tests__/storage.test.js.map +1 -0
- package/dist/fork/__tests__/test.test.d.ts +2 -0
- package/dist/fork/__tests__/test.test.d.ts.map +1 -0
- package/dist/fork/__tests__/test.test.js +81 -0
- package/dist/fork/__tests__/test.test.js.map +1 -0
- package/dist/fork/api.d.ts +14 -3
- package/dist/fork/api.d.ts.map +1 -1
- package/dist/fork/api.js +25 -14
- package/dist/fork/api.js.map +1 -1
- package/dist/fork/manager.d.ts +23 -9
- package/dist/fork/manager.d.ts.map +1 -1
- package/dist/fork/manager.js +79 -36
- package/dist/fork/manager.js.map +1 -1
- package/dist/fork/server.d.ts +11 -3
- package/dist/fork/server.d.ts.map +1 -1
- package/dist/fork/server.js +45 -13
- package/dist/fork/server.js.map +1 -1
- package/dist/fork/storage.d.ts +4 -4
- package/dist/fork/storage.d.ts.map +1 -1
- package/dist/fork/storage.js +7 -9
- package/dist/fork/storage.js.map +1 -1
- package/dist/fork/test.d.ts +13 -4
- package/dist/fork/test.d.ts.map +1 -1
- package/dist/fork/test.js +36 -27
- package/dist/fork/test.js.map +1 -1
- package/dist/harness/Harness.d.ts +124 -0
- package/dist/harness/Harness.d.ts.map +1 -0
- package/dist/harness/Harness.js +193 -0
- package/dist/harness/Harness.js.map +1 -0
- package/dist/harness/codeObject.d.ts +31 -0
- package/dist/harness/codeObject.d.ts.map +1 -0
- package/dist/harness/codeObject.js +271 -0
- package/dist/harness/codeObject.js.map +1 -0
- package/dist/harness/errors.d.ts +14 -0
- package/dist/harness/errors.d.ts.map +1 -0
- package/dist/harness/errors.js +22 -0
- package/dist/harness/errors.js.map +1 -0
- package/dist/harness/index.d.ts +4 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +3 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/proxy.d.ts +7 -0
- package/dist/harness/proxy.d.ts.map +1 -0
- package/dist/harness/proxy.js +36 -0
- package/dist/harness/proxy.js.map +1 -0
- package/dist/harness/script.d.ts +21 -0
- package/dist/harness/script.d.ts.map +1 -0
- package/dist/harness/script.js +155 -0
- package/dist/harness/script.js.map +1 -0
- package/dist/harness/view.d.ts +22 -0
- package/dist/harness/view.d.ts.map +1 -0
- package/dist/harness/view.js +28 -0
- package/dist/harness/view.js.map +1 -0
- package/dist/helpers/__tests__/semver-utils.test.d.ts +2 -0
- package/dist/helpers/__tests__/semver-utils.test.d.ts.map +1 -0
- package/dist/helpers/__tests__/semver-utils.test.js +103 -0
- package/dist/helpers/__tests__/semver-utils.test.js.map +1 -0
- package/dist/helpers/index.d.ts +3 -2
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +2 -2
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/move-tests.d.ts +3 -3
- package/dist/helpers/move-tests.d.ts.map +1 -1
- package/dist/helpers/move-tests.js +21 -20
- package/dist/helpers/move-tests.js.map +1 -1
- package/dist/helpers/npm-registry.d.ts.map +1 -1
- package/dist/helpers/npm-registry.js +1 -3
- package/dist/helpers/npm-registry.js.map +1 -1
- package/dist/helpers/semver-utils.d.ts.map +1 -1
- package/dist/helpers/semver-utils.js +4 -3
- package/dist/helpers/semver-utils.js.map +1 -1
- package/dist/helpers/setup.d.ts.map +1 -1
- package/dist/helpers/setup.js +6 -4
- package/dist/helpers/setup.js.map +1 -1
- package/dist/helpers/setupLocalTesting.d.ts +32 -27
- package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
- package/dist/helpers/setupLocalTesting.js +179 -180
- package/dist/helpers/setupLocalTesting.js.map +1 -1
- package/dist/helpers/testFixtures.d.ts +19 -53
- package/dist/helpers/testFixtures.d.ts.map +1 -1
- package/dist/helpers/testFixtures.js +89 -107
- package/dist/helpers/testFixtures.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/node/LocalNodeManager.d.ts +9 -1
- package/dist/node/LocalNodeManager.d.ts.map +1 -1
- package/dist/node/LocalNodeManager.js +75 -58
- package/dist/node/LocalNodeManager.js.map +1 -1
- package/dist/node/__tests__/LocalNodeManager.test.d.ts +2 -0
- package/dist/node/__tests__/LocalNodeManager.test.d.ts.map +1 -0
- package/dist/node/__tests__/LocalNodeManager.test.js +349 -0
- package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -0
- package/dist/runtime.d.ts +12 -15
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +28 -239
- package/dist/runtime.js.map +1 -1
- package/dist/templates/README.md +1 -1
- package/dist/templates/movehat.config.ts +10 -0
- package/dist/templates/package.json +2 -1
- package/dist/templates/scripts/deploy-counter.ts +46 -38
- package/dist/templates/tests/Counter.test.ts +39 -51
- package/dist/templates/types/movehat.d.ts +6 -9
- package/dist/types/config.d.ts +8 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/fork.d.ts +7 -1
- package/dist/types/fork.d.ts.map +1 -1
- package/dist/types/harness.d.ts +166 -0
- package/dist/types/harness.d.ts.map +1 -0
- package/dist/types/harness.js +2 -0
- package/dist/types/harness.js.map +1 -0
- package/dist/types/runtime.d.ts +7 -1
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/ui/__tests__/colors.test.d.ts +2 -0
- package/dist/ui/__tests__/colors.test.d.ts.map +1 -0
- package/dist/ui/__tests__/colors.test.js +127 -0
- package/dist/ui/__tests__/colors.test.js.map +1 -0
- package/dist/ui/colors.d.ts.map +1 -1
- package/dist/ui/colors.js +6 -2
- package/dist/ui/colors.js.map +1 -1
- package/dist/ui/logger.d.ts +17 -0
- package/dist/ui/logger.d.ts.map +1 -1
- package/dist/ui/logger.js +22 -0
- package/dist/ui/logger.js.map +1 -1
- package/dist/ui/symbols.d.ts +1 -0
- package/dist/ui/symbols.d.ts.map +1 -1
- package/dist/ui/symbols.js +7 -1
- package/dist/ui/symbols.js.map +1 -1
- package/dist/utils/__tests__/address.test.d.ts +2 -0
- package/dist/utils/__tests__/address.test.d.ts.map +1 -0
- package/dist/utils/__tests__/address.test.js +70 -0
- package/dist/utils/__tests__/address.test.js.map +1 -0
- package/dist/utils/__tests__/childProcessAdapter.test.d.ts +2 -0
- package/dist/utils/__tests__/childProcessAdapter.test.d.ts.map +1 -0
- package/dist/utils/__tests__/childProcessAdapter.test.js +217 -0
- package/dist/utils/__tests__/childProcessAdapter.test.js.map +1 -0
- package/dist/utils/__tests__/runCli.test.d.ts +2 -0
- package/dist/utils/__tests__/runCli.test.d.ts.map +1 -0
- package/dist/utils/__tests__/runCli.test.js +187 -0
- package/dist/utils/__tests__/runCli.test.js.map +1 -0
- package/dist/utils/address.d.ts +33 -0
- package/dist/utils/address.d.ts.map +1 -0
- package/dist/utils/address.js +52 -0
- package/dist/utils/address.js.map +1 -0
- package/dist/utils/childProcessAdapter.d.ts +93 -0
- package/dist/utils/childProcessAdapter.d.ts.map +1 -0
- package/dist/utils/childProcessAdapter.js +109 -0
- package/dist/utils/childProcessAdapter.js.map +1 -0
- package/dist/utils/parseCliOutput.d.ts +20 -0
- package/dist/utils/parseCliOutput.d.ts.map +1 -0
- package/dist/utils/parseCliOutput.js +26 -0
- package/dist/utils/parseCliOutput.js.map +1 -0
- package/dist/utils/redact.d.ts +15 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +24 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/runCli.d.ts +24 -0
- package/dist/utils/runCli.d.ts.map +1 -0
- package/dist/utils/runCli.js +37 -0
- package/dist/utils/runCli.js.map +1 -0
- package/package.json +14 -4
- package/src/__tests__/deployContract.test.ts +429 -0
- package/src/__tests__/errors.test.ts +84 -0
- package/src/__tests__/fixtures/sigint-deploy-harness.ts +95 -0
- package/src/__tests__/fork/api.test.ts +143 -0
- package/src/__tests__/harness/Harness.createLive.test.ts +57 -0
- package/src/__tests__/harness/Harness.proxy.test.ts +115 -0
- package/src/__tests__/harness/_fixture.ts +131 -0
- package/src/__tests__/harness/codeObject.deploy.test.ts +319 -0
- package/src/__tests__/harness/codeObject.upgrade.test.ts +156 -0
- package/src/__tests__/harness/script.test.ts +245 -0
- package/src/__tests__/harness/view.test.ts +104 -0
- package/src/__tests__/runtime.test.ts +182 -0
- package/src/cli.ts +2 -1
- package/src/commands/__tests__/compile.test.ts +407 -0
- package/src/commands/__tests__/init.test.ts +125 -0
- package/src/commands/__tests__/run.test.ts +192 -0
- package/src/commands/__tests__/test-move.test.ts +81 -0
- package/src/commands/__tests__/test.test.ts +204 -0
- package/src/commands/__tests__/update.test.ts +223 -0
- package/src/commands/compile.ts +168 -32
- package/src/commands/fork/__tests__/create.test.ts +132 -0
- package/src/commands/fork/__tests__/fund.test.ts +104 -0
- package/src/commands/fork/__tests__/list.test.ts +139 -0
- package/src/commands/fork/__tests__/serve.test.ts +121 -0
- package/src/commands/fork/__tests__/view-resource.test.ts +101 -0
- package/src/commands/fork/create.ts +4 -3
- package/src/commands/fork/fund.ts +16 -9
- package/src/commands/fork/list.ts +3 -2
- package/src/commands/fork/serve.ts +6 -3
- package/src/commands/fork/view-resource.ts +11 -6
- package/src/commands/run.ts +54 -28
- package/src/commands/test-move.ts +4 -3
- package/src/commands/test.ts +56 -44
- package/src/commands/update.ts +19 -16
- package/src/core/AccountManager.ts +23 -10
- package/src/core/Publisher.ts +322 -0
- package/src/core/__tests__/AccountManager.test.ts +290 -0
- package/src/core/__tests__/config.test.ts +377 -0
- package/src/core/__tests__/deployments.test.ts +247 -0
- package/src/core/__tests__/shell.test.ts +138 -0
- package/src/core/config.ts +96 -12
- package/src/core/contract.ts +13 -4
- package/src/core/deployments.ts +13 -11
- package/src/core/movementProfile.ts +179 -0
- package/src/core/shell.ts +34 -14
- package/src/errors.ts +60 -0
- package/src/fork/__tests__/manager.test.ts +385 -0
- package/src/fork/__tests__/server.test.ts +65 -0
- package/src/fork/__tests__/storage.test.ts +281 -0
- package/src/fork/__tests__/test.test.ts +97 -0
- package/src/fork/api.ts +28 -14
- package/src/fork/manager.ts +88 -43
- package/src/fork/server.ts +53 -19
- package/src/fork/storage.ts +12 -15
- package/src/fork/test.ts +58 -32
- package/src/harness/Harness.ts +228 -0
- package/src/harness/codeObject.ts +388 -0
- package/src/harness/errors.ts +22 -0
- package/src/harness/index.ts +3 -0
- package/src/harness/proxy.ts +40 -0
- package/src/harness/script.ts +196 -0
- package/src/harness/view.ts +34 -0
- package/src/helpers/__tests__/semver-utils.test.ts +121 -0
- package/src/helpers/index.ts +2 -8
- package/src/helpers/move-tests.ts +27 -23
- package/src/helpers/npm-registry.ts +4 -3
- package/src/helpers/semver-utils.ts +4 -3
- package/src/helpers/setup.ts +6 -4
- package/src/helpers/setupLocalTesting.ts +219 -200
- package/src/helpers/testFixtures.ts +106 -118
- package/src/index.ts +9 -3
- package/src/node/LocalNodeManager.ts +87 -62
- package/src/node/__tests__/LocalNodeManager.test.ts +452 -0
- package/src/runtime.ts +30 -288
- package/src/templates/README.md +1 -1
- package/src/templates/movehat.config.ts +10 -0
- package/src/templates/package.json +2 -1
- package/src/templates/scripts/deploy-counter.ts +46 -38
- package/src/templates/tests/Counter.test.ts +39 -51
- package/src/templates/types/movehat.d.ts +6 -9
- package/src/types/config.ts +8 -0
- package/src/types/fork.ts +7 -1
- package/src/types/harness.ts +182 -0
- package/src/types/runtime.ts +11 -3
- package/src/ui/__tests__/colors.test.ts +156 -0
- package/src/ui/colors.ts +5 -2
- package/src/ui/logger.ts +22 -0
- package/src/ui/symbols.ts +7 -1
- package/src/utils/__tests__/address.test.ts +93 -0
- package/src/utils/__tests__/childProcessAdapter.test.ts +266 -0
- package/src/utils/__tests__/runCli.test.ts +240 -0
- package/src/utils/address.ts +56 -0
- package/src/utils/childProcessAdapter.ts +215 -0
- package/src/utils/parseCliOutput.ts +27 -0
- package/src/utils/redact.ts +24 -0
- 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
|
+
}
|