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