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
@@ -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
+ }