ic-mops 1.11.1 → 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 (352) hide show
  1. package/.DS_Store +0 -0
  2. package/.eslintrc.json +7 -7
  3. package/CHANGELOG.md +15 -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/bun.lock +234 -198
  12. package/bundle/bench/bench-canister.mo +2 -2
  13. package/bundle/bench/user-bench.mo +0 -4
  14. package/bundle/bin/mops.js +1 -1
  15. package/bundle/cli.js +1000 -924
  16. package/bundle/cli.tgz +0 -0
  17. package/bundle/declarations/bench/bench.did +3 -3
  18. package/bundle/declarations/bench/bench.did.d.ts +3 -3
  19. package/bundle/declarations/bench/index.d.ts +3 -3
  20. package/bundle/declarations/bench/index.js +1 -1
  21. package/bundle/declarations/main/index.d.ts +3 -3
  22. package/bundle/declarations/main/index.js +1 -1
  23. package/bundle/declarations/main/main.did +78 -121
  24. package/bundle/declarations/main/main.did.d.ts +48 -98
  25. package/bundle/declarations/main/main.did.js +53 -107
  26. package/bundle/declarations/storage/index.d.ts +3 -3
  27. package/bundle/declarations/storage/index.js +4 -4
  28. package/bundle/declarations/storage/storage.did.d.ts +3 -3
  29. package/bundle/package.json +6 -5
  30. package/bundle/templates/mops-publish.yml +3 -3
  31. package/bundle/templates/mops-test.yml +3 -3
  32. package/bundle-package-json.ts +8 -8
  33. package/cache.ts +80 -65
  34. package/check-requirements.ts +49 -45
  35. package/cli.ts +577 -376
  36. package/commands/add.ts +142 -129
  37. package/commands/available-updates.ts +55 -28
  38. package/commands/bench/bench-canister.mo +114 -108
  39. package/commands/bench/user-bench.mo +6 -6
  40. package/commands/bench-replica.ts +146 -106
  41. package/commands/bench.ts +563 -497
  42. package/commands/build.ts +177 -0
  43. package/commands/bump.ts +68 -57
  44. package/commands/check-candid.ts +24 -0
  45. package/commands/docs-coverage.ts +124 -102
  46. package/commands/docs.ts +118 -108
  47. package/commands/format.ts +171 -155
  48. package/commands/init.ts +301 -275
  49. package/commands/install/install-all.ts +75 -62
  50. package/commands/install/install-dep.ts +43 -28
  51. package/commands/install/install-deps.ts +23 -15
  52. package/commands/install/install-local-dep.ts +42 -34
  53. package/commands/install/install-mops-dep.ts +154 -123
  54. package/commands/install/sync-local-cache.ts +39 -35
  55. package/commands/maintainer.ts +109 -99
  56. package/commands/outdated.ts +31 -18
  57. package/commands/owner.ts +107 -99
  58. package/commands/publish.ts +534 -443
  59. package/commands/remove.ts +119 -89
  60. package/commands/replica.ts +391 -303
  61. package/commands/search.ts +42 -36
  62. package/commands/self.ts +63 -56
  63. package/commands/sources.ts +66 -49
  64. package/commands/sync.ts +92 -75
  65. package/commands/template.ts +145 -102
  66. package/commands/test/mmf1.ts +146 -119
  67. package/commands/test/reporters/compact-reporter.ts +87 -84
  68. package/commands/test/reporters/files-reporter.ts +56 -51
  69. package/commands/test/reporters/reporter.ts +12 -6
  70. package/commands/test/reporters/silent-reporter.ts +58 -59
  71. package/commands/test/reporters/verbose-reporter.ts +66 -54
  72. package/commands/test/test.ts +497 -460
  73. package/commands/test/utils.ts +85 -6
  74. package/commands/toolchain/index.ts +363 -322
  75. package/commands/toolchain/moc.ts +78 -50
  76. package/commands/toolchain/pocket-ic.ts +41 -34
  77. package/commands/toolchain/toolchain-utils.ts +92 -72
  78. package/commands/toolchain/wasmtime.ts +37 -34
  79. package/commands/update.ts +91 -56
  80. package/commands/user.ts +90 -81
  81. package/commands/watch/deployer.ts +188 -152
  82. package/commands/watch/error-checker.ts +90 -80
  83. package/commands/watch/formatter.ts +72 -60
  84. package/commands/watch/generator.ts +116 -96
  85. package/commands/watch/globMoFiles.ts +13 -13
  86. package/commands/watch/parseDfxJson.ts +63 -57
  87. package/commands/watch/tester.ts +83 -65
  88. package/commands/watch/warning-checker.ts +149 -136
  89. package/commands/watch/watch.ts +123 -95
  90. package/declarations/bench/bench.did.d.ts +3 -3
  91. package/declarations/bench/index.d.ts +3 -3
  92. package/declarations/bench/index.js +1 -1
  93. package/declarations/main/index.d.ts +3 -3
  94. package/declarations/main/index.js +1 -1
  95. package/declarations/main/main.did.d.ts +3 -3
  96. package/declarations/storage/index.d.ts +3 -3
  97. package/declarations/storage/index.js +4 -4
  98. package/declarations/storage/storage.did.d.ts +3 -3
  99. package/dist/api/actors.d.ts +4 -4
  100. package/dist/api/actors.js +8 -8
  101. package/dist/api/downloadPackageFiles.d.ts +2 -2
  102. package/dist/api/downloadPackageFiles.js +10 -10
  103. package/dist/api/getHighestVersion.js +1 -1
  104. package/dist/api/index.d.ts +4 -4
  105. package/dist/api/index.js +4 -4
  106. package/dist/api/network.js +9 -9
  107. package/dist/api/resolveVersion.js +3 -3
  108. package/dist/bin/mops.js +1 -1
  109. package/dist/bundle-package-json.js +8 -8
  110. package/dist/cache.js +22 -17
  111. package/dist/check-requirements.js +11 -11
  112. package/dist/cli.js +283 -186
  113. package/dist/commands/add.d.ts +1 -1
  114. package/dist/commands/add.js +41 -38
  115. package/dist/commands/available-updates.d.ts +1 -1
  116. package/dist/commands/available-updates.js +32 -14
  117. package/dist/commands/bench/bench-canister.mo +114 -108
  118. package/dist/commands/bench/user-bench.mo +6 -6
  119. package/dist/commands/bench-replica.d.ts +6 -5
  120. package/dist/commands/bench-replica.js +58 -36
  121. package/dist/commands/bench.d.ts +5 -5
  122. package/dist/commands/bench.js +134 -118
  123. package/dist/commands/build.d.ts +7 -0
  124. package/dist/commands/build.js +121 -0
  125. package/dist/commands/bump.js +27 -18
  126. package/dist/commands/check-candid.d.ts +4 -0
  127. package/dist/commands/check-candid.js +15 -0
  128. package/dist/commands/docs-coverage.d.ts +1 -1
  129. package/dist/commands/docs-coverage.js +45 -31
  130. package/dist/commands/docs.d.ts +1 -1
  131. package/dist/commands/docs.js +39 -38
  132. package/dist/commands/format.js +31 -27
  133. package/dist/commands/init.js +102 -92
  134. package/dist/commands/install/install-all.d.ts +2 -2
  135. package/dist/commands/install/install-all.js +23 -21
  136. package/dist/commands/install/install-dep.d.ts +1 -1
  137. package/dist/commands/install/install-dep.js +21 -8
  138. package/dist/commands/install/install-deps.d.ts +1 -1
  139. package/dist/commands/install/install-deps.js +1 -1
  140. package/dist/commands/install/install-local-dep.js +11 -9
  141. package/dist/commands/install/install-mops-dep.d.ts +1 -1
  142. package/dist/commands/install/install-mops-dep.js +32 -27
  143. package/dist/commands/install/sync-local-cache.js +10 -10
  144. package/dist/commands/maintainer.js +21 -21
  145. package/dist/commands/outdated.js +16 -6
  146. package/dist/commands/owner.js +21 -21
  147. package/dist/commands/publish.js +148 -128
  148. package/dist/commands/remove.d.ts +1 -1
  149. package/dist/commands/remove.js +42 -30
  150. package/dist/commands/replica.d.ts +9 -8
  151. package/dist/commands/replica.js +105 -65
  152. package/dist/commands/search.js +15 -13
  153. package/dist/commands/self.js +31 -28
  154. package/dist/commands/sources.d.ts +5 -1
  155. package/dist/commands/sources.js +23 -17
  156. package/dist/commands/sync.d.ts +1 -1
  157. package/dist/commands/sync.js +38 -25
  158. package/dist/commands/template.js +66 -56
  159. package/dist/commands/test/mmf1.d.ts +3 -3
  160. package/dist/commands/test/mmf1.js +33 -31
  161. package/dist/commands/test/reporters/compact-reporter.d.ts +3 -3
  162. package/dist/commands/test/reporters/compact-reporter.js +19 -15
  163. package/dist/commands/test/reporters/files-reporter.d.ts +3 -3
  164. package/dist/commands/test/reporters/files-reporter.js +18 -14
  165. package/dist/commands/test/reporters/reporter.d.ts +2 -2
  166. package/dist/commands/test/reporters/silent-reporter.d.ts +3 -3
  167. package/dist/commands/test/reporters/silent-reporter.js +4 -4
  168. package/dist/commands/test/reporters/verbose-reporter.d.ts +3 -3
  169. package/dist/commands/test/reporters/verbose-reporter.js +17 -13
  170. package/dist/commands/test/test.d.ts +4 -4
  171. package/dist/commands/test/test.js +151 -181
  172. package/dist/commands/test/utils.d.ts +6 -0
  173. package/dist/commands/test/utils.js +63 -2
  174. package/dist/commands/toolchain/index.d.ts +1 -1
  175. package/dist/commands/toolchain/index.js +81 -69
  176. package/dist/commands/toolchain/moc.d.ts +1 -1
  177. package/dist/commands/toolchain/moc.js +48 -24
  178. package/dist/commands/toolchain/pocket-ic.js +12 -12
  179. package/dist/commands/toolchain/toolchain-utils.d.ts +2 -0
  180. package/dist/commands/toolchain/toolchain-utils.js +32 -23
  181. package/dist/commands/toolchain/wasmtime.js +11 -11
  182. package/dist/commands/update.d.ts +1 -1
  183. package/dist/commands/update.js +30 -12
  184. package/dist/commands/user.js +31 -28
  185. package/dist/commands/watch/deployer.d.ts +4 -4
  186. package/dist/commands/watch/deployer.js +45 -36
  187. package/dist/commands/watch/error-checker.d.ts +2 -2
  188. package/dist/commands/watch/error-checker.js +27 -27
  189. package/dist/commands/watch/formatter.d.ts +4 -4
  190. package/dist/commands/watch/formatter.js +17 -17
  191. package/dist/commands/watch/generator.d.ts +3 -3
  192. package/dist/commands/watch/generator.js +28 -23
  193. package/dist/commands/watch/globMoFiles.js +8 -8
  194. package/dist/commands/watch/parseDfxJson.d.ts +2 -2
  195. package/dist/commands/watch/parseDfxJson.js +9 -9
  196. package/dist/commands/watch/tester.d.ts +4 -4
  197. package/dist/commands/watch/tester.js +23 -21
  198. package/dist/commands/watch/warning-checker.d.ts +3 -3
  199. package/dist/commands/watch/warning-checker.js +36 -36
  200. package/dist/commands/watch/watch.js +45 -32
  201. package/dist/declarations/bench/bench.did.d.ts +3 -3
  202. package/dist/declarations/bench/index.d.ts +3 -3
  203. package/dist/declarations/bench/index.js +1 -1
  204. package/dist/declarations/main/index.d.ts +3 -3
  205. package/dist/declarations/main/index.js +1 -1
  206. package/dist/declarations/main/main.did.d.ts +3 -3
  207. package/dist/declarations/storage/index.d.ts +3 -3
  208. package/dist/declarations/storage/index.js +4 -4
  209. package/dist/declarations/storage/storage.did.d.ts +3 -3
  210. package/dist/environments/nodejs/cli.d.ts +1 -0
  211. package/dist/environments/nodejs/cli.js +4 -0
  212. package/dist/environments/web/cli.d.ts +1 -0
  213. package/dist/environments/web/cli.js +4 -0
  214. package/dist/error.d.ts +1 -0
  215. package/dist/error.js +5 -0
  216. package/dist/fix-dist.js +5 -5
  217. package/dist/helpers/find-changelog-entry.js +8 -5
  218. package/dist/helpers/get-dep-name.d.ts +1 -0
  219. package/dist/helpers/get-dep-name.js +4 -1
  220. package/dist/helpers/get-dfx-version.js +4 -4
  221. package/dist/helpers/get-moc-path.js +8 -7
  222. package/dist/helpers/get-moc-version.js +10 -7
  223. package/dist/helpers/get-package-id.js +2 -2
  224. package/dist/helpers/is-candid-compatible.d.ts +1 -0
  225. package/dist/helpers/is-candid-compatible.js +20 -0
  226. package/dist/integrity.d.ts +1 -1
  227. package/dist/integrity.js +47 -38
  228. package/dist/jest.config.d.ts +11 -0
  229. package/dist/jest.config.js +14 -0
  230. package/dist/mops.d.ts +6 -6
  231. package/dist/mops.js +87 -80
  232. package/dist/notify-installs.js +4 -4
  233. package/dist/package.json +11 -10
  234. package/dist/pem.d.ts +3 -3
  235. package/dist/pem.js +20 -12
  236. package/dist/release-cli.js +20 -20
  237. package/dist/resolve-packages.d.ts +1 -1
  238. package/dist/resolve-packages.js +52 -36
  239. package/dist/templates/mops-publish.yml +3 -3
  240. package/dist/templates/mops-test.yml +3 -3
  241. package/dist/templates/src/lib.mo +13 -13
  242. package/dist/templates/test/lib.test.mo +2 -2
  243. package/dist/templates.js +1 -1
  244. package/dist/tests/cli.test.d.ts +1 -0
  245. package/dist/tests/cli.test.js +63 -0
  246. package/dist/types.d.ts +14 -4
  247. package/dist/vessel.d.ts +2 -2
  248. package/dist/vessel.js +41 -34
  249. package/dist/wasm/pkg/bundler/package.json +20 -0
  250. package/dist/wasm/pkg/bundler/wasm.d.ts +3 -0
  251. package/dist/wasm/pkg/bundler/wasm.js +5 -0
  252. package/dist/wasm/pkg/bundler/wasm_bg.js +93 -0
  253. package/dist/wasm/pkg/bundler/wasm_bg.wasm +0 -0
  254. package/dist/wasm/pkg/bundler/wasm_bg.wasm.d.ts +8 -0
  255. package/dist/wasm/pkg/nodejs/package.json +14 -0
  256. package/dist/wasm/pkg/nodejs/wasm.d.ts +3 -0
  257. package/dist/wasm/pkg/nodejs/wasm.js +98 -0
  258. package/dist/wasm/pkg/nodejs/wasm_bg.wasm +0 -0
  259. package/dist/wasm/pkg/nodejs/wasm_bg.wasm.d.ts +8 -0
  260. package/dist/wasm/pkg/web/package.json +18 -0
  261. package/dist/wasm/pkg/web/wasm.d.ts +35 -0
  262. package/dist/wasm/pkg/web/wasm.js +191 -0
  263. package/dist/wasm/pkg/web/wasm_bg.wasm +0 -0
  264. package/dist/wasm/pkg/web/wasm_bg.wasm.d.ts +8 -0
  265. package/dist/wasm.d.ts +5 -0
  266. package/dist/wasm.js +10 -0
  267. package/environments/nodejs/cli.ts +6 -0
  268. package/environments/web/cli.ts +6 -0
  269. package/error.ts +6 -0
  270. package/fix-dist.ts +5 -5
  271. package/global.d.ts +3 -3
  272. package/helpers/find-changelog-entry.ts +26 -23
  273. package/helpers/get-dep-name.ts +7 -3
  274. package/helpers/get-dfx-version.ts +8 -9
  275. package/helpers/get-moc-path.ts +25 -26
  276. package/helpers/get-moc-version.ts +21 -19
  277. package/helpers/get-package-id.ts +4 -4
  278. package/helpers/is-candid-compatible.ts +22 -0
  279. package/integrity.ts +270 -236
  280. package/jest.config.js +14 -0
  281. package/mops.ts +238 -215
  282. package/notify-installs.ts +16 -17
  283. package/package.json +21 -15
  284. package/parallel.ts +28 -24
  285. package/pem.ts +55 -47
  286. package/release-cli.ts +73 -39
  287. package/resolve-packages.ts +231 -189
  288. package/templates/mops-publish.yml +3 -3
  289. package/templates/mops-test.yml +3 -3
  290. package/templates/src/lib.mo +13 -13
  291. package/templates/test/lib.test.mo +2 -2
  292. package/templates.ts +4 -4
  293. package/tests/__snapshots__/cli.test.ts.snap +202 -0
  294. package/tests/build/error/candid/bar.did +3 -0
  295. package/tests/build/error/dfx.json +12 -0
  296. package/tests/build/error/mops.toml +9 -0
  297. package/tests/build/error/src/Bar.mo +5 -0
  298. package/tests/build/error/src/Foo.mo +5 -0
  299. package/tests/build/success/.dfx/local/canister_ids.json +17 -0
  300. package/tests/build/success/.dfx/local/canisters/bar/bar.did +3 -0
  301. package/tests/build/success/.dfx/local/canisters/bar/bar.most +4 -0
  302. package/tests/build/success/.dfx/local/canisters/bar/bar.wasm +0 -0
  303. package/tests/build/success/.dfx/local/canisters/bar/constructor.did +3 -0
  304. package/tests/build/success/.dfx/local/canisters/bar/index.js +42 -0
  305. package/tests/build/success/.dfx/local/canisters/bar/init_args.txt +1 -0
  306. package/tests/build/success/.dfx/local/canisters/bar/service.did +3 -0
  307. package/tests/build/success/.dfx/local/canisters/bar/service.did.d.ts +7 -0
  308. package/tests/build/success/.dfx/local/canisters/bar/service.did.js +4 -0
  309. package/tests/build/success/.dfx/local/canisters/foo/constructor.did +3 -0
  310. package/tests/build/success/.dfx/local/canisters/foo/foo.did +3 -0
  311. package/tests/build/success/.dfx/local/canisters/foo/foo.most +4 -0
  312. package/tests/build/success/.dfx/local/canisters/foo/foo.wasm +0 -0
  313. package/tests/build/success/.dfx/local/canisters/foo/index.js +42 -0
  314. package/tests/build/success/.dfx/local/canisters/foo/init_args.txt +1 -0
  315. package/tests/build/success/.dfx/local/canisters/foo/service.did +3 -0
  316. package/tests/build/success/.dfx/local/canisters/foo/service.did.d.ts +7 -0
  317. package/tests/build/success/.dfx/local/canisters/foo/service.did.js +4 -0
  318. package/tests/build/success/.dfx/local/lsp/ucwa4-rx777-77774-qaada-cai.did +3 -0
  319. package/tests/build/success/.dfx/local/lsp/ulvla-h7777-77774-qaacq-cai.did +3 -0
  320. package/tests/build/success/.dfx/local/network-id +4 -0
  321. package/tests/build/success/candid/bar.did +3 -0
  322. package/tests/build/success/dfx.json +12 -0
  323. package/tests/build/success/mops.toml +9 -0
  324. package/tests/build/success/src/Bar.mo +5 -0
  325. package/tests/build/success/src/Foo.mo +5 -0
  326. package/tests/check-candid/a.did +3 -0
  327. package/tests/check-candid/b.did +5 -0
  328. package/tests/check-candid/c.did +3 -0
  329. package/tests/cli.test.ts +82 -0
  330. package/tsconfig.json +26 -19
  331. package/types.ts +41 -31
  332. package/vessel.ts +219 -187
  333. package/wasm/Cargo.lock +1475 -0
  334. package/wasm/Cargo.toml +28 -0
  335. package/wasm/pkg/bundler/package.json +20 -0
  336. package/wasm/pkg/bundler/wasm.d.ts +3 -0
  337. package/wasm/pkg/bundler/wasm.js +5 -0
  338. package/wasm/pkg/bundler/wasm_bg.js +93 -0
  339. package/wasm/pkg/bundler/wasm_bg.wasm +0 -0
  340. package/wasm/pkg/bundler/wasm_bg.wasm.d.ts +8 -0
  341. package/wasm/pkg/nodejs/package.json +14 -0
  342. package/wasm/pkg/nodejs/wasm.d.ts +3 -0
  343. package/wasm/pkg/nodejs/wasm.js +98 -0
  344. package/wasm/pkg/nodejs/wasm_bg.wasm +0 -0
  345. package/wasm/pkg/nodejs/wasm_bg.wasm.d.ts +8 -0
  346. package/wasm/pkg/web/package.json +18 -0
  347. package/wasm/pkg/web/wasm.d.ts +35 -0
  348. package/wasm/pkg/web/wasm.js +191 -0
  349. package/wasm/pkg/web/wasm_bg.wasm +0 -0
  350. package/wasm/pkg/web/wasm_bg.wasm.d.ts +8 -0
  351. package/wasm/src/lib.rs +17 -0
  352. package/wasm.ts +16 -0
@@ -0,0 +1,177 @@
1
+ import chalk from "chalk";
2
+ import { execa } from "execa";
3
+ import { exists } from "fs-extra";
4
+ import { mkdir } from "node:fs/promises";
5
+ import { join } from "node:path";
6
+ import { getMocPath } from "../helpers/get-moc-path.js";
7
+ import { readConfig } from "../mops.js";
8
+ import { CanisterConfig } from "../types.js";
9
+ import { sourcesArgs } from "./sources.js";
10
+ import { isCandidCompatible } from "../helpers/is-candid-compatible.js";
11
+ import { cliError } from "../error.js";
12
+
13
+ export interface BuildOptions {
14
+ outputDir: string;
15
+ verbose: boolean;
16
+ extraArgs: string[];
17
+ }
18
+
19
+ export const DEFAULT_BUILD_OUTPUT_DIR = ".mops/.build";
20
+
21
+ export async function build(
22
+ canisterNames: string[] | undefined,
23
+ options: Partial<BuildOptions>,
24
+ ): Promise<void> {
25
+ if (canisterNames?.length == 0) {
26
+ cliError("No canisters specified to build");
27
+ }
28
+
29
+ let outputDir = options.outputDir ?? DEFAULT_BUILD_OUTPUT_DIR;
30
+ let mocPath = getMocPath();
31
+ let canisters: Record<string, CanisterConfig> = {};
32
+ let config = readConfig();
33
+ if (config.canisters) {
34
+ canisters =
35
+ Object.fromEntries(
36
+ Object.entries(config.canisters).map(([name, c]) =>
37
+ typeof c === "string" ? [name, { main: c }] : [name, c],
38
+ ),
39
+ ) ?? {};
40
+ }
41
+ if (!Object.keys(canisters).length) {
42
+ cliError(`No Motoko canisters found in mops.toml configuration`);
43
+ }
44
+
45
+ if (canisterNames) {
46
+ canisterNames = canisterNames.filter((name) => name in canisters);
47
+ if (canisterNames.length === 0) {
48
+ throw new Error("No valid canister names specified");
49
+ }
50
+ for (let name of canisterNames) {
51
+ if (!(name in canisters)) {
52
+ cliError(
53
+ `Motoko canister '${name}' not found in mops.toml configuration`,
54
+ );
55
+ }
56
+ }
57
+ }
58
+
59
+ if (!(await exists(outputDir))) {
60
+ await mkdir(outputDir, { recursive: true });
61
+ }
62
+
63
+ const filteredCanisters = canisterNames
64
+ ? Object.fromEntries(
65
+ Object.entries(canisters).filter(([name]) =>
66
+ canisterNames.includes(name),
67
+ ),
68
+ )
69
+ : canisters;
70
+
71
+ for (let [canisterName, canister] of Object.entries(filteredCanisters)) {
72
+ options.verbose && console.time(`build canister ${canisterName}`);
73
+ console.log(chalk.blue("build canister"), chalk.bold(canisterName));
74
+ let motokoPath = canister.main;
75
+ if (!motokoPath) {
76
+ cliError(`No main file is specified for canister ${canisterName}`);
77
+ }
78
+ let args = [
79
+ "-c",
80
+ "--idl",
81
+ "-o",
82
+ join(outputDir, `${canisterName}.wasm`),
83
+ motokoPath,
84
+ ...(options.extraArgs ?? []),
85
+ ...(await sourcesArgs()).flat(),
86
+ ];
87
+ if (config.build?.args) {
88
+ if (typeof config.build.args === "string") {
89
+ cliError(
90
+ `[build] config 'args' should be an array of strings in mops.toml config file`,
91
+ );
92
+ }
93
+ args.push(...config.build.args);
94
+ }
95
+ if (canister.args) {
96
+ if (typeof canister.args === "string") {
97
+ cliError(
98
+ `Canister config 'args' should be an array of strings for canister ${canisterName}`,
99
+ );
100
+ }
101
+ args.push(...canister.args);
102
+ }
103
+ try {
104
+ if (options.verbose) {
105
+ console.log(chalk.gray(mocPath, JSON.stringify(args)));
106
+ }
107
+ const result = await execa(mocPath, args, {
108
+ stdio: options.verbose ? "inherit" : "pipe",
109
+ reject: false,
110
+ });
111
+
112
+ if (result.exitCode !== 0) {
113
+ if (!options.verbose) {
114
+ if (result.stderr) {
115
+ console.error(chalk.red(result.stderr));
116
+ }
117
+ if (result.stdout?.trim()) {
118
+ console.error(chalk.yellow("Build output:"));
119
+ console.error(result.stdout);
120
+ }
121
+ }
122
+ cliError(
123
+ `Build failed for canister ${canisterName} (exit code: ${result.exitCode})`,
124
+ );
125
+ }
126
+
127
+ if (options.verbose && result.stdout && result.stdout.trim()) {
128
+ console.log(result.stdout);
129
+ }
130
+
131
+ if (canister.candid) {
132
+ const generatedDidPath = join(outputDir, `${canisterName}.did`);
133
+ const originalCandidPath = canister.candid;
134
+
135
+ try {
136
+ const compatible = await isCandidCompatible(
137
+ generatedDidPath,
138
+ originalCandidPath,
139
+ );
140
+
141
+ if (!compatible) {
142
+ cliError(
143
+ `Candid compatibility check failed for canister ${canisterName}`,
144
+ );
145
+ }
146
+
147
+ if (options.verbose) {
148
+ console.log(
149
+ chalk.green(
150
+ `Candid compatibility check passed for canister ${canisterName}`,
151
+ ),
152
+ );
153
+ }
154
+ } catch (candidError: any) {
155
+ cliError(
156
+ `Error during Candid compatibility check for canister ${canisterName}`,
157
+ candidError,
158
+ );
159
+ }
160
+ }
161
+ } catch (cliError: any) {
162
+ if (cliError.message?.includes("Build failed for canister")) {
163
+ throw cliError;
164
+ }
165
+ cliError(
166
+ `Error while compiling canister ${canisterName}${cliError?.message ? `\n${cliError.message}` : ""}`,
167
+ );
168
+ }
169
+ options.verbose && console.timeEnd(`build canister ${canisterName}`);
170
+ }
171
+
172
+ console.log(
173
+ chalk.green(
174
+ `\n✓ Built ${Object.keys(filteredCanisters).length} canister${Object.keys(filteredCanisters).length == 1 ? "" : "s"} successfully`,
175
+ ),
176
+ );
177
+ }
package/commands/bump.ts CHANGED
@@ -1,59 +1,70 @@
1
- import process from 'node:process';
2
- import prompts from 'prompts';
3
- import chalk from 'chalk';
4
- import {checkConfigFile, readConfig, writeConfig} from '../mops.js';
5
-
6
- export async function bump(part : string) {
7
- if (!checkConfigFile()) {
8
- return;
9
- }
10
-
11
- if (part && !['major', 'minor', 'patch'].includes(part)) {
12
- console.log(chalk.red('Unknown version part. Available parts: major, minor, patch'));
13
- process.exit(1);
14
- }
15
-
16
- let config = readConfig();
17
-
18
- if (!config.package) {
19
- console.log(chalk.red('No [package] section found in mops.toml.'));
20
- process.exit(1);
21
- }
22
-
23
- console.log(`Current version: ${chalk.yellow.bold(config.package.version)}`);
24
-
25
- if (!part) {
26
- let res = await prompts({
27
- type: 'select',
28
- name: 'part',
29
- message: 'Select new version:',
30
- choices: [
31
- {title: `${updateVersion(config.package.version, 'major')} ${chalk.dim('(major, breaking changes)')}`, value: 'major'},
32
- {title: `${updateVersion(config.package.version, 'minor')} ${chalk.dim('(minor, new features)')}`, value: 'minor'},
33
- {title: `${updateVersion(config.package.version, 'patch')} ${chalk.dim('(patch, bug fixes)')}`, value: 'patch'},
34
- ],
35
- initial: 2,
36
- });
37
- if (!res.part) {
38
- return;
39
- }
40
- part = res.part;
41
- }
42
-
43
- config.package.version = updateVersion(config.package.version, part);
44
- writeConfig(config);
45
- console.log(`Updated version: ${chalk.green.bold(config.package.version)}`);
1
+ import process from "node:process";
2
+ import prompts from "prompts";
3
+ import chalk from "chalk";
4
+ import { checkConfigFile, readConfig, writeConfig } from "../mops.js";
5
+
6
+ export async function bump(part: string) {
7
+ if (!checkConfigFile()) {
8
+ return;
9
+ }
10
+
11
+ if (part && !["major", "minor", "patch"].includes(part)) {
12
+ console.log(
13
+ chalk.red("Unknown version part. Available parts: major, minor, patch"),
14
+ );
15
+ process.exit(1);
16
+ }
17
+
18
+ let config = readConfig();
19
+
20
+ if (!config.package) {
21
+ console.log(chalk.red("No [package] section found in mops.toml."));
22
+ process.exit(1);
23
+ }
24
+
25
+ console.log(`Current version: ${chalk.yellow.bold(config.package.version)}`);
26
+
27
+ if (!part) {
28
+ let res = await prompts({
29
+ type: "select",
30
+ name: "part",
31
+ message: "Select new version:",
32
+ choices: [
33
+ {
34
+ title: `${updateVersion(config.package.version, "major")} ${chalk.dim("(major, breaking changes)")}`,
35
+ value: "major",
36
+ },
37
+ {
38
+ title: `${updateVersion(config.package.version, "minor")} ${chalk.dim("(minor, new features)")}`,
39
+ value: "minor",
40
+ },
41
+ {
42
+ title: `${updateVersion(config.package.version, "patch")} ${chalk.dim("(patch, bug fixes)")}`,
43
+ value: "patch",
44
+ },
45
+ ],
46
+ initial: 2,
47
+ });
48
+ if (!res.part) {
49
+ return;
50
+ }
51
+ part = res.part;
52
+ }
53
+
54
+ config.package.version = updateVersion(config.package.version, part);
55
+ writeConfig(config);
56
+ console.log(`Updated version: ${chalk.green.bold(config.package.version)}`);
46
57
  }
47
58
 
48
- function updateVersion(version : string, part : string) {
49
- let parts = version.split('.');
50
- let idx = ['major', 'minor', 'patch'].indexOf(part);
51
- if (!parts[idx]) {
52
- throw new Error(`Invalid version part: ${part}`);
53
- }
54
- parts[idx] = String(parseInt(parts[idx] || '0') + 1);
55
- for (let i = idx + 1; i < parts.length; i++) {
56
- parts[i] = '0';
57
- }
58
- return parts.join('.');
59
- }
59
+ function updateVersion(version: string, part: string) {
60
+ let parts = version.split(".");
61
+ let idx = ["major", "minor", "patch"].indexOf(part);
62
+ if (!parts[idx]) {
63
+ throw new Error(`Invalid version part: ${part}`);
64
+ }
65
+ parts[idx] = String(parseInt(parts[idx] || "0") + 1);
66
+ for (let i = idx + 1; i < parts.length; i++) {
67
+ parts[i] = "0";
68
+ }
69
+ return parts.join(".");
70
+ }
@@ -0,0 +1,24 @@
1
+ import chalk from "chalk";
2
+ import { isCandidCompatible } from "../helpers/is-candid-compatible.js";
3
+ import { cliError } from "../error.js";
4
+
5
+ export interface CheckCandidOptions {
6
+ verbose?: boolean;
7
+ }
8
+
9
+ export async function checkCandid(
10
+ newPath: string,
11
+ originalPath: string,
12
+ ): Promise<void> {
13
+ try {
14
+ const compatible = await isCandidCompatible(newPath, originalPath);
15
+ if (!compatible) {
16
+ cliError("✖ Candid compatibility check failed");
17
+ }
18
+ console.log(chalk.green("✓ Candid compatibility check passed"));
19
+ } catch (error: any) {
20
+ cliError(
21
+ `Error while checking Candid compatibility${error?.message ? `\n${error.message}` : ""}`,
22
+ );
23
+ }
24
+ }
@@ -1,110 +1,132 @@
1
- import {readFileSync} from 'node:fs';
2
- import chalk from 'chalk';
3
- import {globSync} from 'glob';
4
- import {JSDOM} from 'jsdom';
5
- import {docs} from './docs.js';
6
-
7
- export type DocsCoverageReporter = 'compact' | 'files' | 'missing' | 'verbose' | 'silent';
1
+ import { readFileSync } from "node:fs";
2
+ import chalk from "chalk";
3
+ import { globSync } from "glob";
4
+ import { JSDOM } from "jsdom";
5
+ import { docs } from "./docs.js";
6
+
7
+ export type DocsCoverageReporter =
8
+ | "compact"
9
+ | "files"
10
+ | "missing"
11
+ | "verbose"
12
+ | "silent";
8
13
 
9
14
  type DocsCoverageOptions = {
10
- source : string,
11
- reporter : DocsCoverageReporter,
12
- threshold : number,
15
+ source: string;
16
+ reporter: DocsCoverageReporter;
17
+ threshold: number;
13
18
  };
14
19
 
15
- export async function docsCoverage(options : Partial<DocsCoverageOptions> = {}) {
16
- let docsDir = '.mops/.docs';
17
-
18
- let {source, reporter, threshold} = {
19
- source: 'src',
20
- reporter: 'files',
21
- threshold: 0,
22
- ...options,
23
- };
24
-
25
- await docs({
26
- source,
27
- output: docsDir,
28
- format: 'html',
29
- silent: true,
30
- });
31
-
32
- let files = globSync(`${docsDir}/**/*.html`, {ignore: [`${docsDir}/**/index.html`]});
33
- let coverages = [];
34
-
35
- for (let file of files) {
36
- let coverage = docFileCoverage(file);
37
- coverages.push(coverage);
38
-
39
- if (reporter === 'silent') {
40
- continue;
41
- }
42
- if (reporter !== 'compact' && (reporter !== 'missing' || coverage.coverage < 100)) {
43
- console.log(`• ${coverage.file} ${colorizeCoverage(coverage.coverage)}`);
44
- }
45
- if (reporter === 'missing' && coverage.coverage < 100) {
46
- for (let item of coverage.items) {
47
- if (!item.covered) {
48
- console.log(` ${item.covered ? chalk.green('✓') : chalk.red('✖')} ${item.id} ${chalk.gray(item.type)}`);
49
- }
50
- }
51
- }
52
- else if (reporter === 'verbose') {
53
- for (let item of coverage.items) {
54
- console.log(` ${item.covered ? chalk.green('') : chalk.red('')} ${item.id} ${chalk.gray(item.type)}`);
55
- }
56
- }
57
- }
58
-
59
- if (reporter !== 'compact' && reporter !== 'silent') {
60
- console.log('-'.repeat(50));
61
- }
62
-
63
- let totalCoverage = coverages.reduce((acc, coverage) => acc + coverage.coverage, 0) / (coverages.length || 1);
64
- if (reporter !== 'silent') {
65
- console.log(`Documentation coverage: ${colorizeCoverage(totalCoverage)}`);
66
- }
67
-
68
- if (threshold > 0 && totalCoverage < threshold) {
69
- process.exit(1);
70
- }
71
-
72
- return totalCoverage;
20
+ export async function docsCoverage(options: Partial<DocsCoverageOptions> = {}) {
21
+ let docsDir = ".mops/.docs";
22
+
23
+ let { source, reporter, threshold } = {
24
+ source: "src",
25
+ reporter: "files",
26
+ threshold: 0,
27
+ ...options,
28
+ };
29
+
30
+ await docs({
31
+ source,
32
+ output: docsDir,
33
+ format: "html",
34
+ silent: true,
35
+ });
36
+
37
+ let files = globSync(`${docsDir}/**/*.html`, {
38
+ ignore: [`${docsDir}/**/index.html`],
39
+ });
40
+ let coverages = [];
41
+
42
+ for (let file of files) {
43
+ let coverage = docFileCoverage(file);
44
+ coverages.push(coverage);
45
+
46
+ if (reporter === "silent") {
47
+ continue;
48
+ }
49
+ if (
50
+ reporter !== "compact" &&
51
+ (reporter !== "missing" || coverage.coverage < 100)
52
+ ) {
53
+ console.log(`• ${coverage.file} ${colorizeCoverage(coverage.coverage)}`);
54
+ }
55
+ if (reporter === "missing" && coverage.coverage < 100) {
56
+ for (let item of coverage.items) {
57
+ if (!item.covered) {
58
+ console.log(
59
+ ` ${item.covered ? chalk.green("") : chalk.red("")} ${item.id} ${chalk.gray(item.type)}`,
60
+ );
61
+ }
62
+ }
63
+ } else if (reporter === "verbose") {
64
+ for (let item of coverage.items) {
65
+ console.log(
66
+ ` ${item.covered ? chalk.green("✓") : chalk.red("✖")} ${item.id} ${chalk.gray(item.type)}`,
67
+ );
68
+ }
69
+ }
70
+ }
71
+
72
+ if (reporter !== "compact" && reporter !== "silent") {
73
+ console.log("-".repeat(50));
74
+ }
75
+
76
+ let totalCoverage =
77
+ coverages.reduce((acc, coverage) => acc + coverage.coverage, 0) /
78
+ (coverages.length || 1);
79
+ if (reporter !== "silent") {
80
+ console.log(`Documentation coverage: ${colorizeCoverage(totalCoverage)}`);
81
+ }
82
+
83
+ if (threshold > 0 && totalCoverage < threshold) {
84
+ process.exit(1);
85
+ }
86
+
87
+ return totalCoverage;
73
88
  }
74
89
 
75
- function docFileCoverage(file : string) {
76
- let dom = new JSDOM(readFileSync(file, 'utf-8'));
77
-
78
- let module = dom.window.document.querySelector('h1')?.textContent || '';
79
- let moduleFile = `${module}.mo`;
80
-
81
- let items = [...dom.window.document.querySelectorAll('h4')].map(h4 => {
82
- let id = h4.getAttribute('id')?.replace('type.', '');
83
- let type = h4.className.replace('-declaration', '').replace('function', 'func');
84
- let definition = h4.textContent;
85
- let comment = h4.parentElement?.querySelector('p + p')?.textContent;
86
- return {file: moduleFile, id, type, definition, comment, covered: (comment || '').length >= 5};
87
- });
88
-
89
- let coverage = 0;
90
- if (!items.length) {
91
- coverage = 100;
92
- }
93
- else {
94
- coverage = items.filter(item => item.covered).length / items.length * 100;
95
- }
96
-
97
- return {file: moduleFile, coverage, items};
90
+ function docFileCoverage(file: string) {
91
+ let dom = new JSDOM(readFileSync(file, "utf-8"));
92
+
93
+ let module = dom.window.document.querySelector("h1")?.textContent || "";
94
+ let moduleFile = `${module}.mo`;
95
+
96
+ let items = [...dom.window.document.querySelectorAll("h4")].map((h4) => {
97
+ let id = h4.getAttribute("id")?.replace("type.", "");
98
+ let type = h4.className
99
+ .replace("-declaration", "")
100
+ .replace("function", "func");
101
+ let definition = h4.textContent;
102
+ let comment = h4.parentElement?.querySelector("p + p")?.textContent;
103
+ return {
104
+ file: moduleFile,
105
+ id,
106
+ type,
107
+ definition,
108
+ comment,
109
+ covered: (comment || "").length >= 5,
110
+ };
111
+ });
112
+
113
+ let coverage = 0;
114
+ if (!items.length) {
115
+ coverage = 100;
116
+ } else {
117
+ coverage =
118
+ (items.filter((item) => item.covered).length / items.length) * 100;
119
+ }
120
+
121
+ return { file: moduleFile, coverage, items };
98
122
  }
99
123
 
100
- function colorizeCoverage(coverage : number) {
101
- if (coverage >= 90) {
102
- return chalk.green(coverage.toFixed(2) + '%');
103
- }
104
- else if (coverage >= 50) {
105
- return chalk.yellow(coverage.toFixed(2) + '%');
106
- }
107
- else {
108
- return chalk.red(coverage.toFixed(2) + '%');
109
- }
110
- }
124
+ function colorizeCoverage(coverage: number) {
125
+ if (coverage >= 90) {
126
+ return chalk.green(coverage.toFixed(2) + "%");
127
+ } else if (coverage >= 50) {
128
+ return chalk.yellow(coverage.toFixed(2) + "%");
129
+ } else {
130
+ return chalk.red(coverage.toFixed(2) + "%");
131
+ }
132
+ }