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,77 +1,87 @@
1
- import process from 'node:process';
2
- import { execSync, spawn } from 'node:child_process';
3
- import path from 'node:path';
4
- import fs from 'node:fs';
5
- import { PassThrough } from 'node:stream';
6
- import { spawn as spawnAsync } from 'promisify-child-process';
7
- import { Actor, HttpAgent } from '@icp-sdk/core/agent';
8
- import { PocketIc, PocketIcServer } from 'pic-ic';
9
- import { PocketIc as PocketIcMops, PocketIcServer as PocketIcServerMops } from 'pic-js-mops';
10
- import chalk from 'chalk';
11
- import { readConfig } from '../mops.js';
12
- import { toolchain } from './toolchain/index.js';
13
- import { getDfxVersion } from '../helpers/get-dfx-version.js';
1
+ import process from "node:process";
2
+ import { execSync, spawn, } from "node:child_process";
3
+ import path from "node:path";
4
+ import fs from "node:fs";
5
+ import { PassThrough } from "node:stream";
6
+ import { spawn as spawnAsync } from "promisify-child-process";
7
+ import { Actor, HttpAgent } from "@icp-sdk/core/agent";
8
+ import { PocketIc, PocketIcServer } from "pic-ic";
9
+ import { PocketIc as PocketIcMops, PocketIcServer as PocketIcServerMops, } from "pic-js-mops";
10
+ import chalk from "chalk";
11
+ import { readConfig } from "../mops.js";
12
+ import { toolchain } from "./toolchain/index.js";
13
+ import { getDfxVersion } from "../helpers/get-dfx-version.js";
14
14
  export class Replica {
15
- type = 'dfx';
15
+ type = "dfx";
16
16
  verbose = false;
17
17
  canisters = {};
18
18
  pocketIcServer;
19
19
  pocketIc;
20
20
  dfxProcess;
21
- dir = ''; // absolute path (/.../.mops/.test/)
21
+ dir = ""; // absolute path (/.../.mops/.test/)
22
22
  ttl = 60;
23
23
  async start({ type, dir, verbose, silent } = {}) {
24
24
  this.type = type ?? this.type;
25
25
  this.verbose = verbose ?? this.verbose;
26
26
  this.dir = dir ?? this.dir;
27
27
  silent || console.log(`Starting ${this.type} replica...`);
28
- if (this.type === 'dfx' || this.type === 'dfx-pocket-ic') {
28
+ if (this.type === "dfx" || this.type === "dfx-pocket-ic") {
29
29
  fs.mkdirSync(this.dir, { recursive: true });
30
- fs.writeFileSync(path.join(this.dir, 'dfx.json'), JSON.stringify(this.dfxJson(''), null, 2));
31
- fs.writeFileSync(path.join(this.dir, 'canister.did'), 'service : { runTests: () -> (); }');
30
+ fs.writeFileSync(path.join(this.dir, "dfx.json"), JSON.stringify(this.dfxJson(""), null, 2));
31
+ fs.writeFileSync(path.join(this.dir, "canister.did"), "service : { runTests: () -> (); }");
32
32
  await this.stop();
33
- this.dfxProcess = spawn('dfx', ['start', this.type === 'dfx-pocket-ic' ? '--pocketic' : '', '--clean', (this.verbose ? '' : '-qqqq'), '--artificial-delay', '0'].filter(x => x).flat(), { cwd: this.dir });
33
+ this.dfxProcess = spawn("dfx", [
34
+ "start",
35
+ this.type === "dfx-pocket-ic" ? "--pocketic" : "",
36
+ "--clean",
37
+ this.verbose ? "" : "-qqqq",
38
+ "--artificial-delay",
39
+ "0",
40
+ ]
41
+ .filter((x) => x)
42
+ .flat(), { cwd: this.dir });
34
43
  // process canister logs
35
44
  this._attachCanisterLogHandler(this.dfxProcess);
36
- this.dfxProcess.stdout.on('data', (data) => {
45
+ this.dfxProcess.stdout.on("data", (data) => {
37
46
  if (this.verbose) {
38
- console.log('DFX:', data.toString());
47
+ console.log("DFX:", data.toString());
39
48
  }
40
49
  });
41
- this.dfxProcess.stderr.on('data', (data) => {
50
+ this.dfxProcess.stderr.on("data", (data) => {
42
51
  if (this.verbose) {
43
- console.error('DFX:', data.toString());
52
+ console.error("DFX:", data.toString());
44
53
  }
45
- if (data.toString().includes('Failed to bind socket to')) {
54
+ if (data.toString().includes("Failed to bind socket to")) {
46
55
  console.error(chalk.red(data.toString()));
47
- console.log('Please try again after some time');
56
+ console.log("Please try again after some time");
48
57
  process.exit(11);
49
58
  }
50
59
  });
51
60
  // await for dfx to start
52
61
  let ok = false;
53
62
  while (!ok) {
54
- await fetch('http://127.0.0.1:4945/api/v2/status')
55
- .then(res => {
63
+ await fetch("http://127.0.0.1:4945/api/v2/status")
64
+ .then((res) => {
56
65
  if (res.status === 200) {
57
66
  ok = true;
58
67
  }
59
68
  })
60
69
  .catch(() => { })
61
70
  .finally(() => {
62
- return new Promise(resolve => setTimeout(resolve, 1000));
71
+ return new Promise((resolve) => setTimeout(resolve, 1000));
63
72
  });
64
73
  }
65
74
  }
66
75
  else {
67
- let pocketIcBin = await toolchain.bin('pocket-ic');
76
+ let pocketIcBin = await toolchain.bin("pocket-ic");
68
77
  let config = readConfig();
69
- if (config.toolchain?.['pocket-ic'] !== '4.0.0' && !config.toolchain?.['pocket-ic']?.startsWith('9.')) {
70
- console.error('Current Mops CLI only supports pocket-ic 9.x.x and 4.0.0');
78
+ if (config.toolchain?.["pocket-ic"] !== "4.0.0" &&
79
+ !config.toolchain?.["pocket-ic"]?.startsWith("9.")) {
80
+ console.error("Current Mops CLI only supports pocket-ic 9.x.x and 4.0.0");
71
81
  process.exit(1);
72
82
  }
73
83
  // pocket-ic 9.x.x
74
- if (config.toolchain?.['pocket-ic']?.startsWith('9.')) {
84
+ if (config.toolchain?.["pocket-ic"]?.startsWith("9.")) {
75
85
  this.pocketIcServer = await PocketIcServerMops.start({
76
86
  showRuntimeLogs: false,
77
87
  showCanisterLogs: false,
@@ -95,31 +105,31 @@ export class Replica {
95
105
  }
96
106
  }
97
107
  _attachCanisterLogHandler(proc) {
98
- let curData = '';
99
- proc.stderr.on('data', (data) => {
108
+ let curData = "";
109
+ proc.stderr.on("data", (data) => {
100
110
  curData = curData + data.toString();
101
- if (curData.includes('\n')) {
102
- let chunk = curData.split('\n').slice(0, -1).join('\n');
111
+ if (curData.includes("\n")) {
112
+ let chunk = curData.split("\n").slice(0, -1).join("\n");
103
113
  let matches = [...chunk.matchAll(/\[Canister ([a-z0-9-]+)\] (.*)/g)];
104
114
  for (let match of matches) {
105
115
  let [, canisterId, msg] = match;
106
- let stream = this.getCanisterStream(canisterId || '');
116
+ let stream = this.getCanisterStream(canisterId || "");
107
117
  if (stream) {
108
118
  stream.write(msg);
109
119
  }
110
120
  }
111
121
  if (matches.length) {
112
- curData = curData.split('\n').slice(-1).join('\n');
122
+ curData = curData.split("\n").slice(-1).join("\n");
113
123
  }
114
124
  }
115
125
  });
116
126
  }
117
127
  async stop(sigint = false) {
118
- if (this.type === 'dfx' || this.type === 'dfx-pocket-ic') {
128
+ if (this.type === "dfx" || this.type === "dfx-pocket-ic") {
119
129
  if (this.dfxProcess) {
120
130
  let killed = this.dfxProcess.kill();
121
131
  if (!killed) {
122
- this.dfxProcess.kill('SIGKILL');
132
+ this.dfxProcess.kill("SIGKILL");
123
133
  }
124
134
  // give replica some time to stop
125
135
  let i = 0;
@@ -148,41 +158,59 @@ export class Replica {
148
158
  }
149
159
  }
150
160
  async deploy(name, wasm, idlFactory, cwd = process.cwd(), signal) {
151
- if (this.type === 'dfx' || this.type === 'dfx-pocket-ic') {
161
+ if (this.type === "dfx" || this.type === "dfx-pocket-ic") {
152
162
  // prepare dfx.json for current canister
153
- let dfxJson = path.join(this.dir, 'dfx.json');
163
+ let dfxJson = path.join(this.dir, "dfx.json");
154
164
  let oldDfxJsonData;
155
165
  if (fs.existsSync(dfxJson)) {
156
166
  oldDfxJsonData = JSON.parse(fs.readFileSync(dfxJson).toString());
157
167
  }
158
- let newDfxJsonData = this.dfxJson(name, name + '.wasm');
168
+ let newDfxJsonData = this.dfxJson(name, name + ".wasm");
159
169
  if (oldDfxJsonData.canisters) {
160
170
  newDfxJsonData.canisters = Object.assign(oldDfxJsonData.canisters, newDfxJsonData.canisters);
161
171
  }
162
172
  fs.mkdirSync(this.dir, { recursive: true });
163
173
  fs.writeFileSync(dfxJson, JSON.stringify(newDfxJsonData, null, 2));
164
- await spawnAsync('dfx', ['deploy', name, '--mode', 'reinstall', '--yes', '--identity', 'anonymous'], { cwd: this.dir, signal, stdio: this.verbose ? 'pipe' : ['pipe', 'ignore', 'pipe'] }).catch((error) => {
165
- if (error.code === 'ABORT_ERR') {
166
- return { stderr: '' };
174
+ await spawnAsync("dfx", [
175
+ "deploy",
176
+ name,
177
+ "--mode",
178
+ "reinstall",
179
+ "--yes",
180
+ "--identity",
181
+ "anonymous",
182
+ ], {
183
+ cwd: this.dir,
184
+ signal,
185
+ stdio: this.verbose ? "pipe" : ["pipe", "ignore", "pipe"],
186
+ }).catch((error) => {
187
+ if (error.code === "ABORT_ERR") {
188
+ return { stderr: "" };
167
189
  }
168
190
  throw error;
169
191
  });
170
192
  if (signal?.aborted) {
171
193
  return;
172
194
  }
173
- await spawnAsync('dfx', ['ledger', 'fabricate-cycles', '--canister', name, '--t', '100'], { cwd: this.dir, signal, stdio: this.verbose ? 'pipe' : ['pipe', 'ignore', 'pipe'] }).catch((error) => {
174
- if (error.code === 'ABORT_ERR') {
175
- return { stderr: '' };
195
+ await spawnAsync("dfx", ["ledger", "fabricate-cycles", "--canister", name, "--t", "100"], {
196
+ cwd: this.dir,
197
+ signal,
198
+ stdio: this.verbose ? "pipe" : ["pipe", "ignore", "pipe"],
199
+ }).catch((error) => {
200
+ if (error.code === "ABORT_ERR") {
201
+ return { stderr: "" };
176
202
  }
177
203
  throw error;
178
204
  });
179
205
  if (signal?.aborted) {
180
206
  return;
181
207
  }
182
- let canisterId = execSync(`dfx canister id ${name}`, { cwd: this.dir }).toString().trim();
208
+ let canisterId = execSync(`dfx canister id ${name}`, { cwd: this.dir })
209
+ .toString()
210
+ .trim();
183
211
  let actor = Actor.createActor(idlFactory, {
184
212
  agent: await HttpAgent.create({
185
- host: 'http://127.0.0.1:4945',
213
+ host: "http://127.0.0.1:4945",
186
214
  shouldFetchRootKey: true,
187
215
  }),
188
216
  canisterId,
@@ -228,7 +256,7 @@ export class Replica {
228
256
  return this.canisters[name];
229
257
  }
230
258
  getCanisterId(name) {
231
- return this.canisters[name]?.canisterId || '';
259
+ return this.canisters[name]?.canisterId || "";
232
260
  }
233
261
  getCanisterStream(canisterId) {
234
262
  for (let canister of Object.values(this.canisters)) {
@@ -238,11 +266,11 @@ export class Replica {
238
266
  }
239
267
  return null;
240
268
  }
241
- dfxJson(canisterName, wasmPath = 'canister.wasm', didPath = 'canister.did') {
269
+ dfxJson(canisterName, wasmPath = "canister.wasm", didPath = "canister.did") {
242
270
  let canisters = {};
243
271
  if (canisterName) {
244
272
  canisters[canisterName] = {
245
- type: 'custom',
273
+ type: "custom",
246
274
  wasm: wasmPath,
247
275
  candid: didPath,
248
276
  };
@@ -253,13 +281,13 @@ export class Replica {
253
281
  dfx: getDfxVersion(),
254
282
  defaults: {
255
283
  build: {
256
- packtool: 'mops sources',
284
+ packtool: "mops sources",
257
285
  },
258
286
  },
259
287
  networks: {
260
288
  local: {
261
- type: 'ephemeral',
262
- bind: '127.0.0.1:4945',
289
+ type: "ephemeral",
290
+ bind: "127.0.0.1:4945",
263
291
  },
264
292
  },
265
293
  };
@@ -1,12 +1,12 @@
1
- import process from 'node:process';
2
- import asTable from 'as-table';
3
- import chalk from 'chalk';
4
- import { mainActor } from '../api/actors.js';
1
+ import process from "node:process";
2
+ import asTable from "as-table";
3
+ import chalk from "chalk";
4
+ import { mainActor } from "../api/actors.js";
5
5
  export async function search(text) {
6
6
  let actor = await mainActor();
7
7
  let [packages, _pageCount] = await actor.search(text, [], []);
8
8
  if (!packages.length) {
9
- console.log('Packages not found');
9
+ console.log("Packages not found");
10
10
  return;
11
11
  }
12
12
  let ellipsis = (text, max) => {
@@ -14,23 +14,25 @@ export async function search(text) {
14
14
  return text;
15
15
  }
16
16
  else {
17
- return text.slice(0, max) + '';
17
+ return text.slice(0, max) + "";
18
18
  }
19
19
  };
20
- let maxNameLength = Math.max(...packages.map(a => a.config.name.length));
20
+ let maxNameLength = Math.max(...packages.map((a) => a.config.name.length));
21
21
  let table = packages.map((item) => {
22
22
  return {
23
23
  NAME: chalk.bold(item.config.name),
24
24
  DESCRIPTION: ellipsis(item.config.description, process.stdout.columns - 40 - maxNameLength),
25
25
  VERSION: item.config.version,
26
- UPDATED: new Date(Number(item.publication.time / 1000000n)).toISOString().split('T')[0],
26
+ UPDATED: new Date(Number(item.publication.time / 1000000n))
27
+ .toISOString()
28
+ .split("T")[0],
27
29
  };
28
30
  });
29
- console.log('');
31
+ console.log("");
30
32
  console.log(asTable.configure({
31
- delimiter: chalk.gray(' | '),
32
- dash: chalk.gray(''),
33
- title: t => chalk.gray.bold(t),
33
+ delimiter: chalk.gray(" | "),
34
+ dash: chalk.gray(""),
35
+ title: (t) => chalk.gray.bold(t),
34
36
  })(table));
35
- console.log('');
37
+ console.log("");
36
38
  }
@@ -1,63 +1,66 @@
1
- import process from 'node:process';
2
- import child_process, { execSync } from 'node:child_process';
3
- import chalk from 'chalk';
4
- import { version, globalConfigDir } from '../mops.js';
5
- import { cleanCache } from '../cache.js';
6
- import { toolchain } from './toolchain/index.js';
7
- let url = 'https://x344g-ziaaa-aaaap-abl7a-cai.icp0.io';
1
+ import process from "node:process";
2
+ import child_process, { execSync } from "node:child_process";
3
+ import chalk from "chalk";
4
+ import { version, globalConfigDir } from "../mops.js";
5
+ import { cleanCache } from "../cache.js";
6
+ import { toolchain } from "./toolchain/index.js";
7
+ let url = "https://x344g-ziaaa-aaaap-abl7a-cai.icp0.io";
8
8
  function detectPackageManager() {
9
- let res = '';
9
+ let res = "";
10
10
  try {
11
- res = execSync('which mops').toString();
11
+ res = execSync("which mops").toString();
12
12
  }
13
13
  catch (e) { }
14
14
  if (!res) {
15
- console.error(chalk.red('Couldn\'t detect package manager'));
15
+ console.error(chalk.red("Couldn't detect package manager"));
16
16
  process.exit(1);
17
17
  }
18
- if (res.includes('pnpm/')) {
19
- return 'pnpm';
18
+ if (res.includes("pnpm/")) {
19
+ return "pnpm";
20
20
  }
21
21
  // else if (res.includes('bun/')) {
22
22
  // return 'bun';
23
23
  // }
24
24
  else {
25
- return 'npm';
25
+ return "npm";
26
26
  }
27
27
  }
28
28
  export async function getLatestVersion() {
29
- let res = await fetch(url + '/tags/latest');
29
+ let res = await fetch(url + "/tags/latest");
30
30
  return res.text();
31
31
  }
32
32
  export async function update() {
33
33
  let latest = await getLatestVersion();
34
34
  let current = version();
35
35
  if (latest === current) {
36
- console.log(chalk.green('You are up to date. Version: ' + current));
36
+ console.log(chalk.green("You are up to date. Version: " + current));
37
37
  }
38
38
  else {
39
- console.log('Current version: ' + chalk.yellow(current));
40
- console.log('Updating to version: ' + chalk.green(latest));
39
+ console.log("Current version: " + chalk.yellow(current));
40
+ console.log("Updating to version: " + chalk.green(latest));
41
41
  let pm = detectPackageManager();
42
- let npmArgs = pm === 'npm' ? ['--no-fund', '--silent'] : [];
43
- let proc = child_process.spawn(pm, ['add', '-g', ...npmArgs, `${url}/versions/${latest}.tgz`], { stdio: 'inherit', detached: false });
44
- proc.on('exit', (res) => {
42
+ let npmArgs = pm === "npm" ? ["--no-fund", "--silent"] : [];
43
+ let proc = child_process.spawn(pm, ["add", "-g", ...npmArgs, `${url}/versions/${latest}.tgz`], { stdio: "inherit", detached: false });
44
+ proc.on("exit", (res) => {
45
45
  if (res !== 0) {
46
- console.log(chalk.red('Failed to update.'));
46
+ console.log(chalk.red("Failed to update."));
47
47
  process.exit(1);
48
48
  }
49
- console.log(chalk.green('Success'));
49
+ console.log(chalk.green("Success"));
50
50
  });
51
51
  }
52
52
  }
53
53
  export async function uninstall() {
54
- console.log('Cleaning cache...');
54
+ console.log("Cleaning cache...");
55
55
  cleanCache();
56
- console.log('Resetting toolchain management...');
56
+ console.log("Resetting toolchain management...");
57
57
  toolchain.init({ reset: true, silent: true });
58
- console.log('Uninstalling mops CLI...');
58
+ console.log("Uninstalling mops CLI...");
59
59
  let pm = detectPackageManager();
60
- child_process.spawn(pm, ['remove', '-g', '--silent', 'ic-mops'], { stdio: 'inherit', detached: false });
61
- console.log(chalk.yellow('Config directory has not been deleted: ' + globalConfigDir));
62
- console.log('Uninstalled');
60
+ child_process.spawn(pm, ["remove", "-g", "--silent", "ic-mops"], {
61
+ stdio: "inherit",
62
+ detached: false,
63
+ });
64
+ console.log(chalk.yellow("Config directory has not been deleted: " + globalConfigDir));
65
+ console.log("Uninstalled");
63
66
  }
@@ -1,4 +1,8 @@
1
- export declare function sources({ conflicts, cwd }?: {
1
+ export declare function sourcesArgs({ conflicts, cwd, }?: {
2
+ conflicts?: "ignore" | "error" | "warning" | undefined;
3
+ cwd?: string | undefined;
4
+ }): Promise<string[][]>;
5
+ export declare function sources({ conflicts, cwd, }?: {
2
6
  conflicts?: "ignore" | "error" | "warning" | undefined;
3
7
  cwd?: string | undefined;
4
8
  }): Promise<string[]>;
@@ -1,24 +1,25 @@
1
- import process from 'node:process';
2
- import path from 'node:path';
3
- import fs from 'node:fs';
4
- import { checkConfigFile, formatDir, formatGithubDir, getDependencyType, readConfig } from '../mops.js';
5
- import { resolvePackages } from '../resolve-packages.js';
6
- export async function sources({ conflicts = 'ignore', cwd = process.cwd() } = {}) {
1
+ import process from "node:process";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ import { checkConfigFile, formatDir, formatGithubDir, getDependencyType, readConfig, } from "../mops.js";
5
+ import { resolvePackages } from "../resolve-packages.js";
6
+ export async function sourcesArgs({ conflicts = "ignore", cwd = process.cwd(), } = {}) {
7
7
  if (!checkConfigFile()) {
8
8
  return [];
9
9
  }
10
10
  let resolvedPackages = await resolvePackages({ conflicts });
11
11
  // sources
12
- return Object.entries(resolvedPackages).map(([name, version]) => {
12
+ return Object.entries(resolvedPackages)
13
+ .map(([name, version]) => {
13
14
  let depType = getDependencyType(version);
14
15
  let pkgDir;
15
- if (depType === 'local') {
16
+ if (depType === "local") {
16
17
  pkgDir = path.relative(cwd, version);
17
18
  }
18
- else if (depType === 'github') {
19
+ else if (depType === "github") {
19
20
  pkgDir = path.relative(cwd, formatGithubDir(name, version));
20
21
  }
21
- else if (depType === 'mops') {
22
+ else if (depType === "mops") {
22
23
  pkgDir = path.relative(cwd, formatDir(name, version));
23
24
  }
24
25
  else {
@@ -26,17 +27,22 @@ export async function sources({ conflicts = 'ignore', cwd = process.cwd() } = {}
26
27
  }
27
28
  // append baseDir
28
29
  let pkgBaseDir;
29
- if (fs.existsSync(path.join(pkgDir, 'mops.toml'))) {
30
- let config = readConfig(path.join(pkgDir, 'mops.toml'));
31
- pkgBaseDir = path.join(pkgDir, config.package?.baseDir || 'src');
30
+ if (fs.existsSync(path.join(pkgDir, "mops.toml"))) {
31
+ let config = readConfig(path.join(pkgDir, "mops.toml"));
32
+ pkgBaseDir = path.join(pkgDir, config.package?.baseDir || "src");
32
33
  }
33
34
  else {
34
- pkgBaseDir = path.join(pkgDir, 'src');
35
+ pkgBaseDir = path.join(pkgDir, "src");
35
36
  }
36
37
  // use pkgDir if baseDir doesn't exist for local packages
37
- if (depType === 'local' && !fs.existsSync(path.resolve(cwd, pkgBaseDir))) {
38
+ if (depType === "local" &&
39
+ !fs.existsSync(path.resolve(cwd, pkgBaseDir))) {
38
40
  pkgBaseDir = pkgDir;
39
41
  }
40
- return `--package ${name} ${pkgBaseDir}`;
41
- }).filter(x => x != null);
42
+ return ["--package", name, pkgBaseDir];
43
+ })
44
+ .filter((x) => x != null);
45
+ }
46
+ export async function sources({ conflicts = "ignore", cwd = process.cwd(), } = {}) {
47
+ return (await sourcesArgs({ conflicts, cwd })).map((args) => args.join(" "));
42
48
  }
@@ -1,5 +1,5 @@
1
1
  type SyncOptions = {
2
- lock?: 'update' | 'ignore';
2
+ lock?: "update" | "ignore";
3
3
  };
4
4
  export declare function sync({ lock }?: SyncOptions): Promise<void>;
5
5
  export {};
@@ -1,54 +1,61 @@
1
- import path from 'node:path';
2
- import { execSync } from 'node:child_process';
3
- import { globSync } from 'glob';
4
- import chalk from 'chalk';
5
- import { checkConfigFile, getRootDir, readConfig } from '../mops.js';
6
- import { add } from './add.js';
7
- import { remove } from './remove.js';
8
- import { checkIntegrity } from '../integrity.js';
9
- import { getMocPath } from '../helpers/get-moc-path.js';
1
+ import path from "node:path";
2
+ import { execSync } from "node:child_process";
3
+ import { globSync } from "glob";
4
+ import chalk from "chalk";
5
+ import { checkConfigFile, getRootDir, readConfig } from "../mops.js";
6
+ import { add } from "./add.js";
7
+ import { remove } from "./remove.js";
8
+ import { checkIntegrity } from "../integrity.js";
9
+ import { getMocPath } from "../helpers/get-moc-path.js";
10
10
  export async function sync({ lock } = {}) {
11
11
  if (!checkConfigFile()) {
12
12
  return;
13
13
  }
14
14
  let missing = await getMissingPackages();
15
15
  let unused = await getUnusedPackages();
16
- missing.length && console.log(`${chalk.yellow('Missing packages:')} ${missing.join(', ')}`);
17
- unused.length && console.log(`${chalk.yellow('Unused packages:')} ${unused.join(', ')}`);
16
+ missing.length &&
17
+ console.log(`${chalk.yellow("Missing packages:")} ${missing.join(", ")}`);
18
+ unused.length &&
19
+ console.log(`${chalk.yellow("Unused packages:")} ${unused.join(", ")}`);
18
20
  let config = readConfig();
19
21
  let deps = new Set(Object.keys(config.dependencies || {}));
20
- let devDeps = new Set(Object.keys(config['dev-dependencies'] || {}));
22
+ let devDeps = new Set(Object.keys(config["dev-dependencies"] || {}));
21
23
  // add missing packages
22
24
  for (let pkg of missing) {
23
- await add(pkg, { lock: 'ignore' });
25
+ await add(pkg, { lock: "ignore" });
24
26
  }
25
27
  // remove unused packages
26
28
  for (let pkg of unused) {
27
29
  let dev = devDeps.has(pkg) && !deps.has(pkg);
28
- await remove(pkg, { dev, lock: 'ignore' });
30
+ await remove(pkg, { dev, lock: "ignore" });
29
31
  }
30
32
  await checkIntegrity(lock);
31
33
  }
32
34
  let ignore = [
33
- '**/node_modules/**',
34
- '**/.vessel/**',
35
- '**/.git/**',
36
- '**/.mops/**',
35
+ "**/node_modules/**",
36
+ "**/.vessel/**",
37
+ "**/.git/**",
38
+ "**/.mops/**",
37
39
  ];
38
40
  async function getUsedPackages() {
39
41
  let rootDir = getRootDir();
40
42
  let mocPath = getMocPath();
41
- let files = globSync('**/*.mo', {
43
+ let files = globSync("**/*.mo", {
42
44
  cwd: rootDir,
43
45
  nocase: true,
44
46
  ignore: ignore,
45
47
  });
46
- let packages = new Set;
48
+ let packages = new Set();
47
49
  for (let file of files) {
48
- let deps = execSync(`${mocPath} --print-deps ${path.join(rootDir, file)}`).toString().trim().split('\n');
50
+ let deps = execSync(`${mocPath} --print-deps ${path.join(rootDir, file)}`)
51
+ .toString()
52
+ .trim()
53
+ .split("\n");
49
54
  for (let dep of deps) {
50
- if (dep.startsWith('mo:') && !dep.startsWith('mo:prim') && !dep.startsWith('mo:⛔')) {
51
- packages.add(dep.replace(/^mo:([^/]+).*$/, '$1'));
55
+ if (dep.startsWith("mo:") &&
56
+ !dep.startsWith("mo:prim") &&
57
+ !dep.startsWith("mo:⛔")) {
58
+ packages.add(dep.replace(/^mo:([^/]+).*$/, "$1"));
52
59
  }
53
60
  }
54
61
  }
@@ -56,7 +63,10 @@ async function getUsedPackages() {
56
63
  }
57
64
  async function getMissingPackages() {
58
65
  let config = readConfig();
59
- let allDeps = [...Object.keys(config.dependencies || {}), ...Object.keys(config['dev-dependencies'] || {})];
66
+ let allDeps = [
67
+ ...Object.keys(config.dependencies || {}),
68
+ ...Object.keys(config["dev-dependencies"] || {}),
69
+ ];
60
70
  let missing = new Set(await getUsedPackages());
61
71
  for (let pkg of allDeps) {
62
72
  missing.delete(pkg);
@@ -65,7 +75,10 @@ async function getMissingPackages() {
65
75
  }
66
76
  async function getUnusedPackages() {
67
77
  let config = readConfig();
68
- let allDeps = new Set([...Object.keys(config.dependencies || {}), ...Object.keys(config['dev-dependencies'] || {})]);
78
+ let allDeps = new Set([
79
+ ...Object.keys(config.dependencies || {}),
80
+ ...Object.keys(config["dev-dependencies"] || {}),
81
+ ]);
69
82
  let used = await getUsedPackages();
70
83
  for (let pkg of used) {
71
84
  allDeps.delete(pkg);