ic-mops 1.12.0 → 2.0.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/.DS_Store +0 -0
- package/.eslintrc.json +7 -7
- package/CHANGELOG.md +6 -0
- package/api/actors.ts +41 -37
- package/api/downloadPackageFiles.ts +75 -61
- package/api/getHighestVersion.ts +5 -5
- package/api/index.ts +4 -4
- package/api/network.ts +19 -21
- package/api/resolveVersion.ts +14 -11
- package/bin/mops.js +1 -1
- package/bundle/bench/bench-canister.mo +109 -101
- package/bundle/bench/user-bench.mo +6 -6
- package/bundle/bin/mops.js +1 -1
- package/bundle/cli.js +797 -792
- package/bundle/cli.tgz +0 -0
- package/bundle/package.json +6 -5
- package/bundle/templates/mops-publish.yml +3 -3
- package/bundle/templates/mops-test.yml +3 -3
- package/bundle/templates/src/lib.mo +13 -13
- package/bundle/templates/test/lib.test.mo +2 -2
- package/bundle-package-json.ts +8 -8
- package/cache.ts +80 -65
- package/check-requirements.ts +49 -45
- package/cli.ts +577 -376
- package/commands/add.ts +142 -129
- package/commands/available-updates.ts +55 -41
- package/commands/bench/bench-canister.mo +114 -108
- package/commands/bench/user-bench.mo +6 -6
- package/commands/bench-replica.ts +146 -118
- package/commands/bench.ts +563 -497
- package/commands/build.ts +177 -0
- package/commands/bump.ts +68 -57
- package/commands/check-candid.ts +24 -0
- package/commands/docs-coverage.ts +124 -102
- package/commands/docs.ts +118 -108
- package/commands/format.ts +171 -155
- package/commands/init.ts +301 -275
- package/commands/install/install-all.ts +75 -62
- package/commands/install/install-dep.ts +43 -28
- package/commands/install/install-deps.ts +23 -15
- package/commands/install/install-local-dep.ts +42 -34
- package/commands/install/install-mops-dep.ts +154 -123
- package/commands/install/sync-local-cache.ts +39 -35
- package/commands/maintainer.ts +109 -99
- package/commands/outdated.ts +30 -24
- package/commands/owner.ts +107 -99
- package/commands/publish.ts +534 -443
- package/commands/remove.ts +119 -89
- package/commands/replica.ts +391 -316
- package/commands/search.ts +42 -36
- package/commands/self.ts +63 -56
- package/commands/sources.ts +66 -49
- package/commands/sync.ts +92 -75
- package/commands/template.ts +145 -102
- package/commands/test/mmf1.ts +146 -119
- package/commands/test/reporters/compact-reporter.ts +87 -84
- package/commands/test/reporters/files-reporter.ts +56 -51
- package/commands/test/reporters/reporter.ts +12 -6
- package/commands/test/reporters/silent-reporter.ts +58 -59
- package/commands/test/reporters/verbose-reporter.ts +66 -54
- package/commands/test/test.ts +498 -401
- package/commands/test/utils.ts +72 -67
- package/commands/toolchain/index.ts +363 -322
- package/commands/toolchain/moc.ts +78 -50
- package/commands/toolchain/pocket-ic.ts +41 -34
- package/commands/toolchain/toolchain-utils.ts +92 -72
- package/commands/toolchain/wasmtime.ts +37 -34
- package/commands/update.ts +82 -64
- package/commands/user.ts +90 -81
- package/commands/watch/deployer.ts +188 -152
- package/commands/watch/error-checker.ts +90 -80
- package/commands/watch/formatter.ts +72 -60
- package/commands/watch/generator.ts +116 -96
- package/commands/watch/globMoFiles.ts +13 -13
- package/commands/watch/parseDfxJson.ts +63 -57
- package/commands/watch/tester.ts +83 -65
- package/commands/watch/warning-checker.ts +149 -136
- package/commands/watch/watch.ts +123 -95
- package/dist/api/actors.d.ts +4 -4
- package/dist/api/actors.js +8 -8
- package/dist/api/downloadPackageFiles.d.ts +2 -2
- package/dist/api/downloadPackageFiles.js +10 -10
- package/dist/api/getHighestVersion.js +1 -1
- package/dist/api/index.d.ts +4 -4
- package/dist/api/index.js +4 -4
- package/dist/api/network.js +9 -9
- package/dist/api/resolveVersion.js +3 -3
- package/dist/bin/mops.js +1 -1
- package/dist/bundle-package-json.js +8 -8
- package/dist/cache.js +22 -17
- package/dist/check-requirements.js +11 -11
- package/dist/cli.js +283 -186
- package/dist/commands/add.d.ts +1 -1
- package/dist/commands/add.js +40 -37
- package/dist/commands/available-updates.d.ts +1 -1
- package/dist/commands/available-updates.js +18 -12
- package/dist/commands/bench/bench-canister.mo +114 -108
- package/dist/commands/bench/user-bench.mo +6 -6
- package/dist/commands/bench-replica.d.ts +4 -4
- package/dist/commands/bench-replica.js +45 -34
- package/dist/commands/bench.d.ts +5 -5
- package/dist/commands/bench.js +134 -118
- package/dist/commands/build.d.ts +7 -0
- package/dist/commands/build.js +121 -0
- package/dist/commands/bump.js +27 -18
- package/dist/commands/check-candid.d.ts +4 -0
- package/dist/commands/check-candid.js +15 -0
- package/dist/commands/docs-coverage.d.ts +1 -1
- package/dist/commands/docs-coverage.js +45 -31
- package/dist/commands/docs.d.ts +1 -1
- package/dist/commands/docs.js +39 -38
- package/dist/commands/format.js +31 -27
- package/dist/commands/init.js +102 -92
- package/dist/commands/install/install-all.d.ts +2 -2
- package/dist/commands/install/install-all.js +23 -21
- package/dist/commands/install/install-dep.d.ts +1 -1
- package/dist/commands/install/install-dep.js +21 -8
- package/dist/commands/install/install-deps.d.ts +1 -1
- package/dist/commands/install/install-deps.js +1 -1
- package/dist/commands/install/install-local-dep.js +11 -9
- package/dist/commands/install/install-mops-dep.d.ts +1 -1
- package/dist/commands/install/install-mops-dep.js +32 -27
- package/dist/commands/install/sync-local-cache.js +10 -10
- package/dist/commands/maintainer.js +21 -21
- package/dist/commands/outdated.js +12 -8
- package/dist/commands/owner.js +21 -21
- package/dist/commands/publish.js +148 -128
- package/dist/commands/remove.d.ts +1 -1
- package/dist/commands/remove.js +42 -30
- package/dist/commands/replica.d.ts +7 -7
- package/dist/commands/replica.js +85 -57
- package/dist/commands/search.js +15 -13
- package/dist/commands/self.js +31 -28
- package/dist/commands/sources.d.ts +5 -1
- package/dist/commands/sources.js +23 -17
- package/dist/commands/sync.d.ts +1 -1
- package/dist/commands/sync.js +38 -25
- package/dist/commands/template.js +66 -56
- package/dist/commands/test/mmf1.d.ts +3 -3
- package/dist/commands/test/mmf1.js +33 -31
- package/dist/commands/test/reporters/compact-reporter.d.ts +3 -3
- package/dist/commands/test/reporters/compact-reporter.js +19 -15
- package/dist/commands/test/reporters/files-reporter.d.ts +3 -3
- package/dist/commands/test/reporters/files-reporter.js +18 -14
- package/dist/commands/test/reporters/reporter.d.ts +2 -2
- package/dist/commands/test/reporters/silent-reporter.d.ts +3 -3
- package/dist/commands/test/reporters/silent-reporter.js +4 -4
- package/dist/commands/test/reporters/verbose-reporter.d.ts +3 -3
- package/dist/commands/test/reporters/verbose-reporter.js +17 -13
- package/dist/commands/test/test.d.ts +4 -4
- package/dist/commands/test/test.js +134 -112
- package/dist/commands/test/utils.d.ts +3 -3
- package/dist/commands/test/utils.js +17 -17
- package/dist/commands/toolchain/index.d.ts +1 -1
- package/dist/commands/toolchain/index.js +81 -69
- package/dist/commands/toolchain/moc.d.ts +1 -1
- package/dist/commands/toolchain/moc.js +48 -24
- package/dist/commands/toolchain/pocket-ic.js +12 -12
- package/dist/commands/toolchain/toolchain-utils.d.ts +2 -0
- package/dist/commands/toolchain/toolchain-utils.js +32 -23
- package/dist/commands/toolchain/wasmtime.js +11 -11
- package/dist/commands/update.d.ts +1 -1
- package/dist/commands/update.js +18 -14
- package/dist/commands/user.js +31 -28
- package/dist/commands/watch/deployer.d.ts +4 -4
- package/dist/commands/watch/deployer.js +45 -36
- package/dist/commands/watch/error-checker.d.ts +2 -2
- package/dist/commands/watch/error-checker.js +27 -27
- package/dist/commands/watch/formatter.d.ts +4 -4
- package/dist/commands/watch/formatter.js +17 -17
- package/dist/commands/watch/generator.d.ts +3 -3
- package/dist/commands/watch/generator.js +28 -23
- package/dist/commands/watch/globMoFiles.js +8 -8
- package/dist/commands/watch/parseDfxJson.d.ts +2 -2
- package/dist/commands/watch/parseDfxJson.js +9 -9
- package/dist/commands/watch/tester.d.ts +4 -4
- package/dist/commands/watch/tester.js +23 -21
- package/dist/commands/watch/warning-checker.d.ts +3 -3
- package/dist/commands/watch/warning-checker.js +36 -36
- package/dist/commands/watch/watch.js +45 -32
- package/dist/environments/nodejs/cli.d.ts +1 -0
- package/dist/environments/nodejs/cli.js +4 -0
- package/dist/environments/web/cli.d.ts +1 -0
- package/dist/environments/web/cli.js +4 -0
- package/dist/error.d.ts +1 -0
- package/dist/error.js +5 -0
- package/dist/fix-dist.js +5 -5
- package/dist/helpers/find-changelog-entry.js +8 -5
- package/dist/helpers/get-dep-name.js +2 -2
- package/dist/helpers/get-dfx-version.js +4 -4
- package/dist/helpers/get-moc-path.js +8 -7
- package/dist/helpers/get-moc-version.js +10 -7
- package/dist/helpers/get-package-id.js +2 -2
- package/dist/helpers/is-candid-compatible.d.ts +1 -0
- package/dist/helpers/is-candid-compatible.js +20 -0
- package/dist/integrity.d.ts +1 -1
- package/dist/integrity.js +47 -38
- package/dist/jest.config.d.ts +11 -0
- package/dist/jest.config.js +14 -0
- package/dist/mops.d.ts +6 -6
- package/dist/mops.js +87 -80
- package/dist/notify-installs.js +4 -4
- package/dist/package.json +9 -5
- package/dist/pem.d.ts +3 -3
- package/dist/pem.js +20 -12
- package/dist/release-cli.js +20 -20
- package/dist/resolve-packages.d.ts +1 -1
- package/dist/resolve-packages.js +52 -36
- package/dist/templates/mops-publish.yml +3 -3
- package/dist/templates/mops-test.yml +3 -3
- package/dist/templates/src/lib.mo +13 -13
- package/dist/templates/test/lib.test.mo +2 -2
- package/dist/templates.js +1 -1
- package/dist/tests/cli.test.d.ts +1 -0
- package/dist/tests/cli.test.js +63 -0
- package/dist/types.d.ts +14 -4
- package/dist/vessel.d.ts +2 -2
- package/dist/vessel.js +41 -34
- package/dist/wasm/pkg/bundler/package.json +20 -0
- package/dist/wasm/pkg/bundler/wasm.d.ts +3 -0
- package/dist/wasm/pkg/bundler/wasm.js +5 -0
- package/dist/wasm/pkg/bundler/wasm_bg.js +93 -0
- package/dist/wasm/pkg/bundler/wasm_bg.wasm +0 -0
- package/dist/wasm/pkg/bundler/wasm_bg.wasm.d.ts +8 -0
- package/dist/wasm/pkg/nodejs/package.json +14 -0
- package/dist/wasm/pkg/nodejs/wasm.d.ts +3 -0
- package/dist/wasm/pkg/nodejs/wasm.js +98 -0
- package/dist/wasm/pkg/nodejs/wasm_bg.wasm +0 -0
- package/dist/wasm/pkg/nodejs/wasm_bg.wasm.d.ts +8 -0
- package/dist/wasm/pkg/web/package.json +18 -0
- package/dist/wasm/pkg/web/wasm.d.ts +35 -0
- package/dist/wasm/pkg/web/wasm.js +191 -0
- package/dist/wasm/pkg/web/wasm_bg.wasm +0 -0
- package/dist/wasm/pkg/web/wasm_bg.wasm.d.ts +8 -0
- package/dist/wasm.d.ts +5 -0
- package/dist/wasm.js +10 -0
- package/environments/nodejs/cli.ts +6 -0
- package/environments/web/cli.ts +6 -0
- package/error.ts +6 -0
- package/fix-dist.ts +5 -5
- package/global.d.ts +3 -3
- package/helpers/find-changelog-entry.ts +26 -23
- package/helpers/get-dep-name.ts +5 -5
- package/helpers/get-dfx-version.ts +8 -9
- package/helpers/get-moc-path.ts +25 -26
- package/helpers/get-moc-version.ts +21 -19
- package/helpers/get-package-id.ts +4 -4
- package/helpers/is-candid-compatible.ts +22 -0
- package/integrity.ts +270 -236
- package/jest.config.js +14 -0
- package/mops.ts +238 -215
- package/notify-installs.ts +16 -17
- package/package.json +19 -10
- package/parallel.ts +28 -24
- package/pem.ts +55 -47
- package/release-cli.ts +73 -39
- package/resolve-packages.ts +231 -189
- package/templates/mops-publish.yml +3 -3
- package/templates/mops-test.yml +3 -3
- package/templates/src/lib.mo +13 -13
- package/templates/test/lib.test.mo +2 -2
- package/templates.ts +4 -4
- package/tests/__snapshots__/cli.test.ts.snap +202 -0
- package/tests/build/error/candid/bar.did +3 -0
- package/tests/build/error/dfx.json +12 -0
- package/tests/build/error/mops.toml +9 -0
- package/tests/build/error/src/Bar.mo +5 -0
- package/tests/build/error/src/Foo.mo +5 -0
- package/tests/build/success/.dfx/local/canister_ids.json +17 -0
- package/tests/build/success/.dfx/local/canisters/bar/bar.did +3 -0
- package/tests/build/success/.dfx/local/canisters/bar/bar.most +4 -0
- package/tests/build/success/.dfx/local/canisters/bar/bar.wasm +0 -0
- package/tests/build/success/.dfx/local/canisters/bar/constructor.did +3 -0
- package/tests/build/success/.dfx/local/canisters/bar/index.js +42 -0
- package/tests/build/success/.dfx/local/canisters/bar/init_args.txt +1 -0
- package/tests/build/success/.dfx/local/canisters/bar/service.did +3 -0
- package/tests/build/success/.dfx/local/canisters/bar/service.did.d.ts +7 -0
- package/tests/build/success/.dfx/local/canisters/bar/service.did.js +4 -0
- package/tests/build/success/.dfx/local/canisters/foo/constructor.did +3 -0
- package/tests/build/success/.dfx/local/canisters/foo/foo.did +3 -0
- package/tests/build/success/.dfx/local/canisters/foo/foo.most +4 -0
- package/tests/build/success/.dfx/local/canisters/foo/foo.wasm +0 -0
- package/tests/build/success/.dfx/local/canisters/foo/index.js +42 -0
- package/tests/build/success/.dfx/local/canisters/foo/init_args.txt +1 -0
- package/tests/build/success/.dfx/local/canisters/foo/service.did +3 -0
- package/tests/build/success/.dfx/local/canisters/foo/service.did.d.ts +7 -0
- package/tests/build/success/.dfx/local/canisters/foo/service.did.js +4 -0
- package/tests/build/success/.dfx/local/lsp/ucwa4-rx777-77774-qaada-cai.did +3 -0
- package/tests/build/success/.dfx/local/lsp/ulvla-h7777-77774-qaacq-cai.did +3 -0
- package/tests/build/success/.dfx/local/network-id +4 -0
- package/tests/build/success/candid/bar.did +3 -0
- package/tests/build/success/dfx.json +12 -0
- package/tests/build/success/mops.toml +9 -0
- package/tests/build/success/src/Bar.mo +5 -0
- package/tests/build/success/src/Foo.mo +5 -0
- package/tests/check-candid/a.did +3 -0
- package/tests/check-candid/b.did +5 -0
- package/tests/check-candid/c.did +3 -0
- package/tests/cli.test.ts +82 -0
- package/tsconfig.json +26 -19
- package/types.ts +41 -31
- package/vessel.ts +219 -187
- package/wasm/Cargo.lock +1475 -0
- package/wasm/Cargo.toml +28 -0
- package/wasm/pkg/bundler/package.json +20 -0
- package/wasm/pkg/bundler/wasm.d.ts +3 -0
- package/wasm/pkg/bundler/wasm.js +5 -0
- package/wasm/pkg/bundler/wasm_bg.js +93 -0
- package/wasm/pkg/bundler/wasm_bg.wasm +0 -0
- package/wasm/pkg/bundler/wasm_bg.wasm.d.ts +8 -0
- package/wasm/pkg/nodejs/package.json +14 -0
- package/wasm/pkg/nodejs/wasm.d.ts +3 -0
- package/wasm/pkg/nodejs/wasm.js +98 -0
- package/wasm/pkg/nodejs/wasm_bg.wasm +0 -0
- package/wasm/pkg/nodejs/wasm_bg.wasm.d.ts +8 -0
- package/wasm/pkg/web/package.json +18 -0
- package/wasm/pkg/web/wasm.d.ts +35 -0
- package/wasm/pkg/web/wasm.js +191 -0
- package/wasm/pkg/web/wasm_bg.wasm +0 -0
- package/wasm/pkg/web/wasm_bg.wasm.d.ts +8 -0
- package/wasm/src/lib.rs +17 -0
- package/wasm.ts +16 -0
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import process from
|
|
2
|
-
import { spawn } from
|
|
3
|
-
import path from
|
|
4
|
-
import fs from
|
|
5
|
-
import os from
|
|
6
|
-
import { PassThrough } from
|
|
7
|
-
import chalk from
|
|
8
|
-
import { globSync } from
|
|
9
|
-
import chokidar from
|
|
10
|
-
import debounce from
|
|
11
|
-
import { SemVer } from
|
|
12
|
-
import { sources } from
|
|
13
|
-
import { getRootDir, readConfig } from
|
|
14
|
-
import { parallel } from
|
|
15
|
-
import { MMF1 } from
|
|
16
|
-
import { absToRel, pipeMMF, pipeStderrToMMF, pipeStdoutToMMF } from
|
|
17
|
-
import { VerboseReporter } from
|
|
18
|
-
import { FilesReporter } from
|
|
19
|
-
import { CompactReporter } from
|
|
20
|
-
import { SilentReporter } from
|
|
21
|
-
import { toolchain } from
|
|
22
|
-
import { Replica } from
|
|
23
|
-
import { getDfxVersion } from
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import { PassThrough } from "node:stream";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { globSync } from "glob";
|
|
9
|
+
import chokidar from "chokidar";
|
|
10
|
+
import debounce from "debounce";
|
|
11
|
+
import { SemVer } from "semver";
|
|
12
|
+
import { sources } from "../sources.js";
|
|
13
|
+
import { getRootDir, readConfig } from "../../mops.js";
|
|
14
|
+
import { parallel } from "../../parallel.js";
|
|
15
|
+
import { MMF1 } from "./mmf1.js";
|
|
16
|
+
import { absToRel, pipeMMF, pipeStderrToMMF, pipeStdoutToMMF, } from "./utils.js";
|
|
17
|
+
import { VerboseReporter } from "./reporters/verbose-reporter.js";
|
|
18
|
+
import { FilesReporter } from "./reporters/files-reporter.js";
|
|
19
|
+
import { CompactReporter } from "./reporters/compact-reporter.js";
|
|
20
|
+
import { SilentReporter } from "./reporters/silent-reporter.js";
|
|
21
|
+
import { toolchain } from "../toolchain/index.js";
|
|
22
|
+
import { Replica } from "../replica.js";
|
|
23
|
+
import { getDfxVersion } from "../../helpers/get-dfx-version.js";
|
|
24
24
|
let ignore = [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
"**/node_modules/**",
|
|
26
|
+
"**/.mops/**",
|
|
27
|
+
"**/.vessel/**",
|
|
28
|
+
"**/.git/**",
|
|
29
29
|
];
|
|
30
30
|
let globConfig = {
|
|
31
31
|
nocase: true,
|
|
@@ -41,18 +41,19 @@ async function startReplicaOnce(replica, type) {
|
|
|
41
41
|
}
|
|
42
42
|
return replicaStartPromise;
|
|
43
43
|
}
|
|
44
|
-
export async function test(filter =
|
|
44
|
+
export async function test(filter = "", options = {}) {
|
|
45
45
|
let config = readConfig();
|
|
46
46
|
let rootDir = getRootDir();
|
|
47
|
-
let replicaType = options.replica ??
|
|
48
|
-
|
|
47
|
+
let replicaType = options.replica ??
|
|
48
|
+
(config.toolchain?.["pocket-ic"] ? "pocket-ic" : "dfx");
|
|
49
|
+
if (replicaType === "pocket-ic" && !config.toolchain?.["pocket-ic"]) {
|
|
49
50
|
let dfxVersion = getDfxVersion();
|
|
50
|
-
if (!dfxVersion || new SemVer(dfxVersion).compare(
|
|
51
|
-
console.log(chalk.red(
|
|
51
|
+
if (!dfxVersion || new SemVer(dfxVersion).compare("0.24.1") < 0) {
|
|
52
|
+
console.log(chalk.red("Please update dfx to the version >=0.24.1 or specify pocket-ic version in mops.toml"));
|
|
52
53
|
process.exit(1);
|
|
53
54
|
}
|
|
54
55
|
else {
|
|
55
|
-
replicaType =
|
|
56
|
+
replicaType = "dfx-pocket-ic";
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
replica.type = replicaType;
|
|
@@ -60,14 +61,14 @@ export async function test(filter = '', options = {}) {
|
|
|
60
61
|
if (options.watch) {
|
|
61
62
|
replica.ttl = 60 * 15; // 15 minutes
|
|
62
63
|
let sigint = false;
|
|
63
|
-
process.on(
|
|
64
|
+
process.on("SIGINT", () => {
|
|
64
65
|
if (sigint) {
|
|
65
|
-
console.log(
|
|
66
|
+
console.log("Force exit");
|
|
66
67
|
process.exit(0);
|
|
67
68
|
}
|
|
68
69
|
sigint = true;
|
|
69
70
|
if (replicaStartPromise) {
|
|
70
|
-
console.log(
|
|
71
|
+
console.log("Stopping replica...");
|
|
71
72
|
replica.stop(true).then(() => {
|
|
72
73
|
process.exit(0);
|
|
73
74
|
});
|
|
@@ -84,22 +85,19 @@ export async function test(filter = '', options = {}) {
|
|
|
84
85
|
controller.abort();
|
|
85
86
|
await curRun;
|
|
86
87
|
console.clear();
|
|
87
|
-
process.stdout.write(
|
|
88
|
+
process.stdout.write("\x1Bc");
|
|
88
89
|
controller = new AbortController();
|
|
89
90
|
curRun = runAll(options.reporter, filter, options.mode, replicaType, true, controller.signal);
|
|
90
91
|
await curRun;
|
|
91
|
-
console.log(
|
|
92
|
-
console.log(
|
|
93
|
-
console.log(chalk.gray(
|
|
92
|
+
console.log("-".repeat(50));
|
|
93
|
+
console.log("Waiting for file changes...");
|
|
94
|
+
console.log(chalk.gray(`Press ${chalk.gray("Ctrl+C")} to exit.`));
|
|
94
95
|
}, 200);
|
|
95
|
-
let watcher = chokidar.watch([
|
|
96
|
-
path.join(rootDir, '**/*.mo'),
|
|
97
|
-
path.join(rootDir, 'mops.toml'),
|
|
98
|
-
], {
|
|
96
|
+
let watcher = chokidar.watch([path.join(rootDir, "**/*.mo"), path.join(rootDir, "mops.toml")], {
|
|
99
97
|
ignored: ignore,
|
|
100
98
|
ignoreInitial: true,
|
|
101
99
|
});
|
|
102
|
-
watcher.on(
|
|
100
|
+
watcher.on("all", () => {
|
|
103
101
|
run();
|
|
104
102
|
});
|
|
105
103
|
run();
|
|
@@ -111,21 +109,21 @@ export async function test(filter = '', options = {}) {
|
|
|
111
109
|
}
|
|
112
110
|
}
|
|
113
111
|
}
|
|
114
|
-
let mocPath =
|
|
115
|
-
let wasmtimePath =
|
|
116
|
-
async function runAll(reporterName, filter =
|
|
112
|
+
let mocPath = "";
|
|
113
|
+
let wasmtimePath = "";
|
|
114
|
+
async function runAll(reporterName, filter = "", mode = "interpreter", replicaType, watch = false, signal) {
|
|
117
115
|
let done = await testWithReporter(reporterName, filter, mode, replicaType, watch, signal);
|
|
118
116
|
return done;
|
|
119
117
|
}
|
|
120
|
-
export async function testWithReporter(reporterName, filter =
|
|
118
|
+
export async function testWithReporter(reporterName, filter = "", defaultMode = "interpreter", replicaType, watch = false, signal) {
|
|
121
119
|
let rootDir = getRootDir();
|
|
122
120
|
let files = [];
|
|
123
|
-
let libFiles = globSync(
|
|
121
|
+
let libFiles = globSync("**/test?(s)/lib.mo", globConfig);
|
|
124
122
|
if (libFiles[0]) {
|
|
125
123
|
files = [libFiles[0]];
|
|
126
124
|
}
|
|
127
125
|
else {
|
|
128
|
-
let globStr =
|
|
126
|
+
let globStr = "**/test?(s)/**/*.test.mo";
|
|
129
127
|
if (filter) {
|
|
130
128
|
globStr = `**/test?(s)/**/*${filter}*.mo`;
|
|
131
129
|
}
|
|
@@ -136,26 +134,26 @@ export async function testWithReporter(reporterName, filter = '', defaultMode =
|
|
|
136
134
|
console.log(`No test files found for filter '${filter}'`);
|
|
137
135
|
return false;
|
|
138
136
|
}
|
|
139
|
-
console.log(
|
|
140
|
-
console.log(
|
|
137
|
+
console.log("No test files found");
|
|
138
|
+
console.log("Put your tests in 'test' directory in *.test.mo files");
|
|
141
139
|
return false;
|
|
142
140
|
}
|
|
143
141
|
let reporter;
|
|
144
|
-
if (!reporterName || typeof reporterName ===
|
|
142
|
+
if (!reporterName || typeof reporterName === "string") {
|
|
145
143
|
if (!reporterName) {
|
|
146
|
-
reporterName = files.length > 1 ?
|
|
144
|
+
reporterName = files.length > 1 ? "files" : "verbose";
|
|
147
145
|
}
|
|
148
|
-
if (reporterName ==
|
|
149
|
-
reporter = new CompactReporter;
|
|
146
|
+
if (reporterName == "compact") {
|
|
147
|
+
reporter = new CompactReporter();
|
|
150
148
|
}
|
|
151
|
-
else if (reporterName ==
|
|
152
|
-
reporter = new FilesReporter;
|
|
149
|
+
else if (reporterName == "files") {
|
|
150
|
+
reporter = new FilesReporter();
|
|
153
151
|
}
|
|
154
|
-
else if (reporterName ==
|
|
155
|
-
reporter = new SilentReporter;
|
|
152
|
+
else if (reporterName == "silent") {
|
|
153
|
+
reporter = new SilentReporter();
|
|
156
154
|
}
|
|
157
155
|
else {
|
|
158
|
-
reporter = new VerboseReporter;
|
|
156
|
+
reporter = new VerboseReporter();
|
|
159
157
|
}
|
|
160
158
|
}
|
|
161
159
|
else {
|
|
@@ -165,51 +163,59 @@ export async function testWithReporter(reporterName, filter = '', defaultMode =
|
|
|
165
163
|
let config = readConfig();
|
|
166
164
|
let sourcesArr = await sources();
|
|
167
165
|
if (!mocPath) {
|
|
168
|
-
mocPath = await toolchain.bin(
|
|
166
|
+
mocPath = await toolchain.bin("moc", { fallback: true });
|
|
169
167
|
}
|
|
170
|
-
let testTempDir = path.join(getRootDir(),
|
|
168
|
+
let testTempDir = path.join(getRootDir(), ".mops/.test/");
|
|
171
169
|
replica.dir = testTempDir;
|
|
172
170
|
fs.rmSync(testTempDir, { recursive: true, force: true });
|
|
173
171
|
fs.mkdirSync(testTempDir, { recursive: true });
|
|
174
172
|
let filesWithMode = files.map((file) => {
|
|
175
|
-
let lines = fs.readFileSync(file,
|
|
173
|
+
let lines = fs.readFileSync(file, "utf8").split("\n");
|
|
176
174
|
let mode = defaultMode;
|
|
177
|
-
if (lines.includes(
|
|
178
|
-
mode =
|
|
175
|
+
if (lines.includes("// @testmode wasi")) {
|
|
176
|
+
mode = "wasi";
|
|
179
177
|
}
|
|
180
|
-
else if (lines.includes(
|
|
181
|
-
|
|
178
|
+
else if (lines.includes("// @testmode replica") ||
|
|
179
|
+
lines.find((line) => line.match(/^(persistent )?actor( class)?/))) {
|
|
180
|
+
mode = "replica";
|
|
182
181
|
}
|
|
183
182
|
return { file, mode };
|
|
184
183
|
});
|
|
185
|
-
let hasWasiTests = filesWithMode.some(({ mode }) => mode ===
|
|
186
|
-
let hasReplicaTests = filesWithMode.some(({ mode }) => mode ===
|
|
184
|
+
let hasWasiTests = filesWithMode.some(({ mode }) => mode === "wasi");
|
|
185
|
+
let hasReplicaTests = filesWithMode.some(({ mode }) => mode === "replica");
|
|
187
186
|
// prepare wasmtime path
|
|
188
187
|
if (hasWasiTests && !wasmtimePath) {
|
|
189
188
|
// ensure wasmtime is installed or specified in config
|
|
190
189
|
if (config.toolchain?.wasmtime) {
|
|
191
|
-
wasmtimePath = await toolchain.bin(
|
|
190
|
+
wasmtimePath = await toolchain.bin("wasmtime");
|
|
192
191
|
}
|
|
193
192
|
// fallback wasmtime to global binary if not specified in config (legacy)
|
|
194
193
|
else {
|
|
195
|
-
wasmtimePath =
|
|
196
|
-
console.log(chalk.yellow(
|
|
197
|
-
console.log(`Run ${chalk.green(
|
|
194
|
+
wasmtimePath = "wasmtime";
|
|
195
|
+
console.log(chalk.yellow("Warning:"), 'Wasmtime is not specified in config. Using global binary "wasmtime". This will be removed in the future.');
|
|
196
|
+
console.log(`Run ${chalk.green("mops toolchain use wasmtime")} or add ${chalk.green('wasmtime = "<version>"')} in mops.toml to avoid breaking changes with future versions of mops.`);
|
|
198
197
|
}
|
|
199
198
|
}
|
|
200
|
-
let runTestFile = async ({ file, mode }) => {
|
|
199
|
+
let runTestFile = async ({ file, mode, }) => {
|
|
201
200
|
if (signal?.aborted) {
|
|
202
201
|
return;
|
|
203
202
|
}
|
|
204
203
|
// print logs immediately for replica tests because we run them one-by-one
|
|
205
|
-
let mmf = new MMF1(mode ===
|
|
204
|
+
let mmf = new MMF1(mode === "replica" ? "print" : "store", absToRel(file));
|
|
206
205
|
let promise = new Promise((resolve) => {
|
|
207
|
-
let mocArgs = [
|
|
206
|
+
let mocArgs = [
|
|
207
|
+
"--hide-warnings",
|
|
208
|
+
"--error-detail=2",
|
|
209
|
+
...sourcesArr.join(" ").split(" "),
|
|
210
|
+
file,
|
|
211
|
+
].filter((x) => x);
|
|
208
212
|
// interpret
|
|
209
|
-
if (mode ===
|
|
210
|
-
let proc = spawn(mocPath, [
|
|
211
|
-
|
|
212
|
-
|
|
213
|
+
if (mode === "interpreter") {
|
|
214
|
+
let proc = spawn(mocPath, ["-r", "-ref-system-api", ...mocArgs], {
|
|
215
|
+
signal,
|
|
216
|
+
});
|
|
217
|
+
proc.addListener("error", (error) => {
|
|
218
|
+
if (error?.code === "ABORT_ERR") {
|
|
213
219
|
return;
|
|
214
220
|
}
|
|
215
221
|
throw error;
|
|
@@ -217,62 +223,76 @@ export async function testWithReporter(reporterName, filter = '', defaultMode =
|
|
|
217
223
|
pipeMMF(proc, mmf).then(resolve);
|
|
218
224
|
}
|
|
219
225
|
// build and run wasm
|
|
220
|
-
else if (mode ===
|
|
226
|
+
else if (mode === "wasi") {
|
|
221
227
|
let wasmFile = `${path.join(testTempDir, path.parse(file).name)}.wasm`;
|
|
222
228
|
// build
|
|
223
|
-
let buildProc = spawn(mocPath, [`-o=${wasmFile}`,
|
|
224
|
-
buildProc.addListener(
|
|
225
|
-
if (error?.code ===
|
|
229
|
+
let buildProc = spawn(mocPath, [`-o=${wasmFile}`, "-wasi-system-api", ...mocArgs], { signal });
|
|
230
|
+
buildProc.addListener("error", (error) => {
|
|
231
|
+
if (error?.code === "ABORT_ERR") {
|
|
226
232
|
return;
|
|
227
233
|
}
|
|
228
234
|
throw error;
|
|
229
235
|
});
|
|
230
|
-
pipeMMF(buildProc, mmf)
|
|
236
|
+
pipeMMF(buildProc, mmf)
|
|
237
|
+
.then(async () => {
|
|
231
238
|
if (mmf.failed > 0) {
|
|
232
239
|
return;
|
|
233
240
|
}
|
|
234
241
|
// run
|
|
235
242
|
let wasmtimeArgs = [];
|
|
236
|
-
if (config.toolchain?.wasmtime &&
|
|
243
|
+
if (config.toolchain?.wasmtime &&
|
|
244
|
+
config.toolchain?.wasmtime >= "14.0.0") {
|
|
237
245
|
wasmtimeArgs = [
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
246
|
+
"-S",
|
|
247
|
+
"preview2=n",
|
|
248
|
+
"-C",
|
|
249
|
+
"cache=n",
|
|
250
|
+
"-W",
|
|
251
|
+
"bulk-memory",
|
|
252
|
+
"-W",
|
|
253
|
+
"multi-memory",
|
|
254
|
+
"-W",
|
|
255
|
+
"memory64",
|
|
256
|
+
"-W",
|
|
257
|
+
"max-wasm-stack=4000000",
|
|
258
|
+
"-W",
|
|
259
|
+
"nan-canonicalization=y",
|
|
245
260
|
wasmFile,
|
|
246
261
|
];
|
|
247
262
|
}
|
|
248
263
|
else {
|
|
249
|
-
console.error(chalk.red(
|
|
264
|
+
console.error(chalk.red("Minimum wasmtime version is 14.0.0. Please update wasmtime to the latest version"));
|
|
250
265
|
process.exit(1);
|
|
251
266
|
}
|
|
252
267
|
let proc = spawn(wasmtimePath, wasmtimeArgs, { signal });
|
|
253
|
-
proc.addListener(
|
|
254
|
-
if (error?.code ===
|
|
268
|
+
proc.addListener("error", (error) => {
|
|
269
|
+
if (error?.code === "ABORT_ERR") {
|
|
255
270
|
return;
|
|
256
271
|
}
|
|
257
272
|
throw error;
|
|
258
273
|
});
|
|
259
274
|
await pipeMMF(proc, mmf);
|
|
260
|
-
})
|
|
275
|
+
})
|
|
276
|
+
.finally(() => {
|
|
261
277
|
fs.rmSync(wasmFile, { force: true });
|
|
262
|
-
})
|
|
278
|
+
})
|
|
279
|
+
.then(resolve);
|
|
263
280
|
}
|
|
264
281
|
// build and execute in replica
|
|
265
|
-
else if (mode ===
|
|
282
|
+
else if (mode === "replica") {
|
|
266
283
|
let wasmFile = `${path.join(testTempDir, path.parse(file).name)}.wasm`;
|
|
267
284
|
// build
|
|
268
|
-
let buildProc = spawn(mocPath, [`-o=${wasmFile}`, ...mocArgs], {
|
|
269
|
-
|
|
270
|
-
|
|
285
|
+
let buildProc = spawn(mocPath, [`-o=${wasmFile}`, ...mocArgs], {
|
|
286
|
+
signal,
|
|
287
|
+
});
|
|
288
|
+
buildProc.addListener("error", (error) => {
|
|
289
|
+
if (error?.code === "ABORT_ERR") {
|
|
271
290
|
return;
|
|
272
291
|
}
|
|
273
292
|
throw error;
|
|
274
293
|
});
|
|
275
|
-
pipeMMF(buildProc, mmf)
|
|
294
|
+
pipeMMF(buildProc, mmf)
|
|
295
|
+
.then(async () => {
|
|
276
296
|
if (mmf.failed > 0) {
|
|
277
297
|
return;
|
|
278
298
|
}
|
|
@@ -282,14 +302,14 @@ export async function testWithReporter(reporterName, filter = '', defaultMode =
|
|
|
282
302
|
}
|
|
283
303
|
let canisterName = path.parse(file).name;
|
|
284
304
|
let idlFactory = ({ IDL }) => {
|
|
285
|
-
return IDL.Service({
|
|
305
|
+
return IDL.Service({ runTests: IDL.Func([], [], []) });
|
|
286
306
|
};
|
|
287
307
|
let canister = await replica.deploy(canisterName, wasmFile, idlFactory, undefined, signal);
|
|
288
308
|
if (signal?.aborted || !canister) {
|
|
289
309
|
return;
|
|
290
310
|
}
|
|
291
311
|
pipeStdoutToMMF(canister.stream, mmf);
|
|
292
|
-
let actor = await replica.getActor(canisterName);
|
|
312
|
+
let actor = (await replica.getActor(canisterName));
|
|
293
313
|
try {
|
|
294
314
|
if (globalThis.mopsReplicaTestRunning) {
|
|
295
315
|
await new Promise((resolve) => {
|
|
@@ -298,7 +318,7 @@ export async function testWithReporter(reporterName, filter = '', defaultMode =
|
|
|
298
318
|
resolve();
|
|
299
319
|
clearInterval(timerId);
|
|
300
320
|
}
|
|
301
|
-
}, Math.random() * 1000 | 0);
|
|
321
|
+
}, (Math.random() * 1000) | 0);
|
|
302
322
|
});
|
|
303
323
|
}
|
|
304
324
|
if (signal?.aborted) {
|
|
@@ -314,10 +334,12 @@ export async function testWithReporter(reporterName, filter = '', defaultMode =
|
|
|
314
334
|
pipeStderrToMMF(stderrStream, mmf, path.dirname(file));
|
|
315
335
|
stderrStream.write(e.message);
|
|
316
336
|
}
|
|
317
|
-
})
|
|
337
|
+
})
|
|
338
|
+
.finally(async () => {
|
|
318
339
|
globalThis.mopsReplicaTestRunning = false;
|
|
319
340
|
fs.rmSync(wasmFile, { force: true });
|
|
320
|
-
})
|
|
341
|
+
})
|
|
342
|
+
.then(resolve);
|
|
321
343
|
}
|
|
322
344
|
});
|
|
323
345
|
if (signal?.aborted) {
|
|
@@ -326,8 +348,8 @@ export async function testWithReporter(reporterName, filter = '', defaultMode =
|
|
|
326
348
|
reporter.addRun(file, mmf, promise, mode);
|
|
327
349
|
await promise;
|
|
328
350
|
};
|
|
329
|
-
await parallel(os.cpus().length, filesWithMode.filter(({ mode }) => mode !==
|
|
330
|
-
await parallel(1, filesWithMode.filter(({ mode }) => mode ===
|
|
351
|
+
await parallel(os.cpus().length, filesWithMode.filter(({ mode }) => mode !== "replica"), runTestFile);
|
|
352
|
+
await parallel(1, filesWithMode.filter(({ mode }) => mode === "replica"), runTestFile);
|
|
331
353
|
if (hasReplicaTests && !watch) {
|
|
332
354
|
await replica.stop();
|
|
333
355
|
fs.rmSync(testTempDir, { recursive: true, force: true });
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ChildProcessWithoutNullStreams } from
|
|
2
|
-
import { Readable } from
|
|
3
|
-
import { MMF1 } from
|
|
1
|
+
import { ChildProcessWithoutNullStreams } from "node:child_process";
|
|
2
|
+
import { Readable } from "node:stream";
|
|
3
|
+
import { MMF1 } from "./mmf1.js";
|
|
4
4
|
export declare function absToRel(p: string): string;
|
|
5
5
|
export declare function pipeStdoutToMMF(stdout: Readable, mmf: MMF1): void;
|
|
6
6
|
export declare function pipeStderrToMMF(stderr: Readable, mmf: MMF1, dir?: string): void;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import path from
|
|
2
|
-
import fs from
|
|
3
|
-
import chalk from
|
|
4
|
-
import { getRootDir } from
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { getRootDir } from "../../mops.js";
|
|
5
5
|
export function absToRel(p) {
|
|
6
6
|
let rootDir = getRootDir();
|
|
7
7
|
return path.relative(rootDir, path.resolve(p));
|
|
8
8
|
}
|
|
9
9
|
export function pipeStdoutToMMF(stdout, mmf) {
|
|
10
|
-
stdout.on(
|
|
11
|
-
for (let line of data.toString().split(
|
|
10
|
+
stdout.on("data", (data) => {
|
|
11
|
+
for (let line of data.toString().split("\n")) {
|
|
12
12
|
line = line.trim();
|
|
13
13
|
if (line) {
|
|
14
14
|
mmf.parseLine(line);
|
|
@@ -16,10 +16,10 @@ export function pipeStdoutToMMF(stdout, mmf) {
|
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
-
export function pipeStderrToMMF(stderr, mmf, dir =
|
|
20
|
-
stderr.on(
|
|
19
|
+
export function pipeStderrToMMF(stderr, mmf, dir = "") {
|
|
20
|
+
stderr.on("data", (data) => {
|
|
21
21
|
let text = data.toString().trim();
|
|
22
|
-
let failedLine =
|
|
22
|
+
let failedLine = "";
|
|
23
23
|
text = text.replace(/([\w+._/-]+):(\d+).(\d+)(-\d+.\d+)/g, (_m0, m1, m2, m3) => {
|
|
24
24
|
// change absolute file path to relative
|
|
25
25
|
// change :line:col-line:col to :line:col to work in vscode
|
|
@@ -30,17 +30,17 @@ export function pipeStderrToMMF(stderr, mmf, dir = '') {
|
|
|
30
30
|
}
|
|
31
31
|
// show failed line
|
|
32
32
|
let content = fs.readFileSync(file);
|
|
33
|
-
let lines = content.toString().split(
|
|
34
|
-
failedLine += chalk.dim(
|
|
33
|
+
let lines = content.toString().split("\n") || [];
|
|
34
|
+
failedLine += chalk.dim("\n ...");
|
|
35
35
|
let lineBefore = lines[+m2 - 2];
|
|
36
36
|
if (lineBefore) {
|
|
37
|
-
failedLine += chalk.dim(`\n ${+m2 - 1}\t| ${lineBefore.replaceAll(
|
|
37
|
+
failedLine += chalk.dim(`\n ${+m2 - 1}\t| ${lineBefore.replaceAll("\t", " ")}`);
|
|
38
38
|
}
|
|
39
|
-
failedLine += `\n${chalk.redBright `->`} ${m2}\t| ${lines[+m2 - 1]?.replaceAll(
|
|
39
|
+
failedLine += `\n${chalk.redBright `->`} ${m2}\t| ${lines[+m2 - 1]?.replaceAll("\t", " ")}`;
|
|
40
40
|
if (lines.length > +m2) {
|
|
41
|
-
failedLine += chalk.dim(`\n ${+m2 + 1}\t| ${lines[+m2]?.replaceAll(
|
|
41
|
+
failedLine += chalk.dim(`\n ${+m2 + 1}\t| ${lines[+m2]?.replaceAll("\t", " ")}`);
|
|
42
42
|
}
|
|
43
|
-
failedLine += chalk.dim(
|
|
43
|
+
failedLine += chalk.dim("\n ...");
|
|
44
44
|
return res;
|
|
45
45
|
});
|
|
46
46
|
if (failedLine) {
|
|
@@ -54,9 +54,9 @@ export function pipeMMF(proc, mmf) {
|
|
|
54
54
|
pipeStdoutToMMF(proc.stdout, mmf);
|
|
55
55
|
pipeStderrToMMF(proc.stderr, mmf);
|
|
56
56
|
// exit
|
|
57
|
-
proc.on(
|
|
57
|
+
proc.on("close", (code) => {
|
|
58
58
|
if (code === 0) {
|
|
59
|
-
mmf.strategy !==
|
|
59
|
+
mmf.strategy !== "print" && mmf.pass();
|
|
60
60
|
}
|
|
61
61
|
else if (code !== 1) {
|
|
62
62
|
mmf.fail(`unknown exit code: ${code}`);
|