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,30 +1,39 @@
1
- import process from 'node:process';
2
- import prompts from 'prompts';
3
- import chalk from 'chalk';
4
- import { checkConfigFile, readConfig, writeConfig } from '../mops.js';
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
5
  export async function bump(part) {
6
6
  if (!checkConfigFile()) {
7
7
  return;
8
8
  }
9
- if (part && !['major', 'minor', 'patch'].includes(part)) {
10
- console.log(chalk.red('Unknown version part. Available parts: major, minor, patch'));
9
+ if (part && !["major", "minor", "patch"].includes(part)) {
10
+ console.log(chalk.red("Unknown version part. Available parts: major, minor, patch"));
11
11
  process.exit(1);
12
12
  }
13
13
  let config = readConfig();
14
14
  if (!config.package) {
15
- console.log(chalk.red('No [package] section found in mops.toml.'));
15
+ console.log(chalk.red("No [package] section found in mops.toml."));
16
16
  process.exit(1);
17
17
  }
18
18
  console.log(`Current version: ${chalk.yellow.bold(config.package.version)}`);
19
19
  if (!part) {
20
20
  let res = await prompts({
21
- type: 'select',
22
- name: 'part',
23
- message: 'Select new version:',
21
+ type: "select",
22
+ name: "part",
23
+ message: "Select new version:",
24
24
  choices: [
25
- { title: `${updateVersion(config.package.version, 'major')} ${chalk.dim('(major, breaking changes)')}`, value: 'major' },
26
- { title: `${updateVersion(config.package.version, 'minor')} ${chalk.dim('(minor, new features)')}`, value: 'minor' },
27
- { title: `${updateVersion(config.package.version, 'patch')} ${chalk.dim('(patch, bug fixes)')}`, value: 'patch' },
25
+ {
26
+ title: `${updateVersion(config.package.version, "major")} ${chalk.dim("(major, breaking changes)")}`,
27
+ value: "major",
28
+ },
29
+ {
30
+ title: `${updateVersion(config.package.version, "minor")} ${chalk.dim("(minor, new features)")}`,
31
+ value: "minor",
32
+ },
33
+ {
34
+ title: `${updateVersion(config.package.version, "patch")} ${chalk.dim("(patch, bug fixes)")}`,
35
+ value: "patch",
36
+ },
28
37
  ],
29
38
  initial: 2,
30
39
  });
@@ -38,14 +47,14 @@ export async function bump(part) {
38
47
  console.log(`Updated version: ${chalk.green.bold(config.package.version)}`);
39
48
  }
40
49
  function updateVersion(version, part) {
41
- let parts = version.split('.');
42
- let idx = ['major', 'minor', 'patch'].indexOf(part);
50
+ let parts = version.split(".");
51
+ let idx = ["major", "minor", "patch"].indexOf(part);
43
52
  if (!parts[idx]) {
44
53
  throw new Error(`Invalid version part: ${part}`);
45
54
  }
46
- parts[idx] = String(parseInt(parts[idx] || '0') + 1);
55
+ parts[idx] = String(parseInt(parts[idx] || "0") + 1);
47
56
  for (let i = idx + 1; i < parts.length; i++) {
48
- parts[i] = '0';
57
+ parts[i] = "0";
49
58
  }
50
- return parts.join('.');
59
+ return parts.join(".");
51
60
  }
@@ -0,0 +1,4 @@
1
+ export interface CheckCandidOptions {
2
+ verbose?: boolean;
3
+ }
4
+ export declare function checkCandid(newPath: string, originalPath: string): Promise<void>;
@@ -0,0 +1,15 @@
1
+ import chalk from "chalk";
2
+ import { isCandidCompatible } from "../helpers/is-candid-compatible.js";
3
+ import { cliError } from "../error.js";
4
+ export async function checkCandid(newPath, originalPath) {
5
+ try {
6
+ const compatible = await isCandidCompatible(newPath, originalPath);
7
+ if (!compatible) {
8
+ cliError("✖ Candid compatibility check failed");
9
+ }
10
+ console.log(chalk.green("✓ Candid compatibility check passed"));
11
+ }
12
+ catch (error) {
13
+ cliError(`Error while checking Candid compatibility${error?.message ? `\n${error.message}` : ""}`);
14
+ }
15
+ }
@@ -1,4 +1,4 @@
1
- export type DocsCoverageReporter = 'compact' | 'files' | 'missing' | 'verbose' | 'silent';
1
+ export type DocsCoverageReporter = "compact" | "files" | "missing" | "verbose" | "silent";
2
2
  type DocsCoverageOptions = {
3
3
  source: string;
4
4
  reporter: DocsCoverageReporter;
@@ -1,51 +1,55 @@
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';
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
6
  export async function docsCoverage(options = {}) {
7
- let docsDir = '.mops/.docs';
7
+ let docsDir = ".mops/.docs";
8
8
  let { source, reporter, threshold } = {
9
- source: 'src',
10
- reporter: 'files',
9
+ source: "src",
10
+ reporter: "files",
11
11
  threshold: 0,
12
12
  ...options,
13
13
  };
14
14
  await docs({
15
15
  source,
16
16
  output: docsDir,
17
- format: 'html',
17
+ format: "html",
18
18
  silent: true,
19
19
  });
20
- let files = globSync(`${docsDir}/**/*.html`, { ignore: [`${docsDir}/**/index.html`] });
20
+ let files = globSync(`${docsDir}/**/*.html`, {
21
+ ignore: [`${docsDir}/**/index.html`],
22
+ });
21
23
  let coverages = [];
22
24
  for (let file of files) {
23
25
  let coverage = docFileCoverage(file);
24
26
  coverages.push(coverage);
25
- if (reporter === 'silent') {
27
+ if (reporter === "silent") {
26
28
  continue;
27
29
  }
28
- if (reporter !== 'compact' && (reporter !== 'missing' || coverage.coverage < 100)) {
30
+ if (reporter !== "compact" &&
31
+ (reporter !== "missing" || coverage.coverage < 100)) {
29
32
  console.log(`• ${coverage.file} ${colorizeCoverage(coverage.coverage)}`);
30
33
  }
31
- if (reporter === 'missing' && coverage.coverage < 100) {
34
+ if (reporter === "missing" && coverage.coverage < 100) {
32
35
  for (let item of coverage.items) {
33
36
  if (!item.covered) {
34
- console.log(` ${item.covered ? chalk.green('') : chalk.red('')} ${item.id} ${chalk.gray(item.type)}`);
37
+ console.log(` ${item.covered ? chalk.green("") : chalk.red("")} ${item.id} ${chalk.gray(item.type)}`);
35
38
  }
36
39
  }
37
40
  }
38
- else if (reporter === 'verbose') {
41
+ else if (reporter === "verbose") {
39
42
  for (let item of coverage.items) {
40
- console.log(` ${item.covered ? chalk.green('') : chalk.red('')} ${item.id} ${chalk.gray(item.type)}`);
43
+ console.log(` ${item.covered ? chalk.green("") : chalk.red("")} ${item.id} ${chalk.gray(item.type)}`);
41
44
  }
42
45
  }
43
46
  }
44
- if (reporter !== 'compact' && reporter !== 'silent') {
45
- console.log('-'.repeat(50));
47
+ if (reporter !== "compact" && reporter !== "silent") {
48
+ console.log("-".repeat(50));
46
49
  }
47
- let totalCoverage = coverages.reduce((acc, coverage) => acc + coverage.coverage, 0) / (coverages.length || 1);
48
- if (reporter !== 'silent') {
50
+ let totalCoverage = coverages.reduce((acc, coverage) => acc + coverage.coverage, 0) /
51
+ (coverages.length || 1);
52
+ if (reporter !== "silent") {
49
53
  console.log(`Documentation coverage: ${colorizeCoverage(totalCoverage)}`);
50
54
  }
51
55
  if (threshold > 0 && totalCoverage < threshold) {
@@ -54,33 +58,43 @@ export async function docsCoverage(options = {}) {
54
58
  return totalCoverage;
55
59
  }
56
60
  function docFileCoverage(file) {
57
- let dom = new JSDOM(readFileSync(file, 'utf-8'));
58
- let module = dom.window.document.querySelector('h1')?.textContent || '';
61
+ let dom = new JSDOM(readFileSync(file, "utf-8"));
62
+ let module = dom.window.document.querySelector("h1")?.textContent || "";
59
63
  let moduleFile = `${module}.mo`;
60
- let items = [...dom.window.document.querySelectorAll('h4')].map(h4 => {
61
- let id = h4.getAttribute('id')?.replace('type.', '');
62
- let type = h4.className.replace('-declaration', '').replace('function', 'func');
64
+ let items = [...dom.window.document.querySelectorAll("h4")].map((h4) => {
65
+ let id = h4.getAttribute("id")?.replace("type.", "");
66
+ let type = h4.className
67
+ .replace("-declaration", "")
68
+ .replace("function", "func");
63
69
  let definition = h4.textContent;
64
- let comment = h4.parentElement?.querySelector('p + p')?.textContent;
65
- return { file: moduleFile, id, type, definition, comment, covered: (comment || '').length >= 5 };
70
+ let comment = h4.parentElement?.querySelector("p + p")?.textContent;
71
+ return {
72
+ file: moduleFile,
73
+ id,
74
+ type,
75
+ definition,
76
+ comment,
77
+ covered: (comment || "").length >= 5,
78
+ };
66
79
  });
67
80
  let coverage = 0;
68
81
  if (!items.length) {
69
82
  coverage = 100;
70
83
  }
71
84
  else {
72
- coverage = items.filter(item => item.covered).length / items.length * 100;
85
+ coverage =
86
+ (items.filter((item) => item.covered).length / items.length) * 100;
73
87
  }
74
88
  return { file: moduleFile, coverage, items };
75
89
  }
76
90
  function colorizeCoverage(coverage) {
77
91
  if (coverage >= 90) {
78
- return chalk.green(coverage.toFixed(2) + '%');
92
+ return chalk.green(coverage.toFixed(2) + "%");
79
93
  }
80
94
  else if (coverage >= 50) {
81
- return chalk.yellow(coverage.toFixed(2) + '%');
95
+ return chalk.yellow(coverage.toFixed(2) + "%");
82
96
  }
83
97
  else {
84
- return chalk.red(coverage.toFixed(2) + '%');
98
+ return chalk.red(coverage.toFixed(2) + "%");
85
99
  }
86
100
  }
@@ -1,7 +1,7 @@
1
1
  type DocsOptions = {
2
2
  source: string;
3
3
  output: string;
4
- format: 'md' | 'adoc' | 'html';
4
+ format: "md" | "adoc" | "html";
5
5
  silent: boolean;
6
6
  archive: boolean;
7
7
  };
@@ -1,39 +1,40 @@
1
- import process from 'node:process';
2
- import { spawn } from 'node:child_process';
3
- import fs from 'node:fs';
4
- import path from 'node:path';
5
- import chalk from 'chalk';
6
- import { globSync } from 'glob';
7
- import { deleteSync } from 'del';
8
- import { create as createTar } from 'tar';
9
- import streamToPromise from 'stream-to-promise';
10
- import { getRootDir } from '../mops.js';
11
- import { toolchain } from './toolchain/index.js';
1
+ import process from "node:process";
2
+ import { spawn } from "node:child_process";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import chalk from "chalk";
6
+ import { globSync } from "glob";
7
+ import { deleteSync } from "del";
8
+ import { create as createTar } from "tar";
9
+ import streamToPromise from "stream-to-promise";
10
+ import { getRootDir } from "../mops.js";
11
+ import { toolchain } from "./toolchain/index.js";
12
12
  let moDocPath;
13
13
  export async function docs(options = {}) {
14
14
  let { source, output, format, silent, archive } = {
15
- source: 'src',
16
- output: '.mops/.docs',
17
- format: 'adoc',
15
+ source: "src",
16
+ output: ".mops/.docs",
17
+ format: "adoc",
18
18
  silent: false,
19
19
  archive: false,
20
20
  ...options,
21
21
  };
22
- if (format === 'md') {
23
- format = 'plain';
22
+ if (format === "md") {
23
+ format = "plain";
24
24
  }
25
25
  let rootDir = getRootDir();
26
26
  let docsDir = path.join(rootDir, output);
27
27
  let docsDirRelative = path.relative(process.cwd(), docsDir);
28
28
  deleteSync([docsDir], { force: true });
29
29
  // detect mocv (legacy)
30
- if (process.env.DFX_MOC_PATH && process.env.DFX_MOC_PATH.includes('mocv/versions')) {
31
- moDocPath = process.env.DFX_MOC_PATH.replace(/\/moc$/, '/mo-doc');
30
+ if (process.env.DFX_MOC_PATH &&
31
+ process.env.DFX_MOC_PATH.includes("mocv/versions")) {
32
+ moDocPath = process.env.DFX_MOC_PATH.replace(/\/moc$/, "/mo-doc");
32
33
  }
33
34
  else {
34
35
  // fallbacks to dfx moc if not specified in config
35
- let mocPath = await toolchain.bin('moc', { fallback: true });
36
- moDocPath = mocPath.replace(/\/moc$/, '/mo-doc');
36
+ let mocPath = await toolchain.bin("moc", { fallback: true });
37
+ moDocPath = mocPath.replace(/\/moc$/, "/mo-doc");
37
38
  }
38
39
  // generate docs
39
40
  await new Promise((resolve) => {
@@ -43,37 +44,39 @@ export async function docs(options = {}) {
43
44
  `--format=${format}`,
44
45
  ]);
45
46
  // stdout
46
- proc.stdout.on('data', (data) => {
47
+ proc.stdout.on("data", (data) => {
47
48
  let text = data.toString().trim();
48
- let failedText = 'Failed to extract documentation';
49
+ let failedText = "Failed to extract documentation";
49
50
  if (text.includes(failedText)) {
50
- silent || console.log(text.replaceAll(failedText, chalk.yellow('Warning: ') + failedText));
51
+ silent ||
52
+ console.log(text.replaceAll(failedText, chalk.yellow("Warning: ") + failedText));
51
53
  }
52
- silent || console.log('stdout', text);
54
+ silent || console.log("stdout", text);
53
55
  });
54
56
  // stderr
55
- let stderr = '';
56
- proc.stderr.on('data', (data) => {
57
+ let stderr = "";
58
+ proc.stderr.on("data", (data) => {
57
59
  let text = data.toString().trim();
58
- if (text.includes('syntax error')) {
59
- console.log(chalk.red('Error:'), text);
60
+ if (text.includes("syntax error")) {
61
+ console.log(chalk.red("Error:"), text);
60
62
  process.exit(1);
61
63
  }
62
- if (text.includes('No such file or directory') || text.includes('Couldn\'t find a module expression')) {
64
+ if (text.includes("No such file or directory") ||
65
+ text.includes("Couldn't find a module expression")) {
63
66
  silent || console.log(text);
64
67
  return;
65
68
  }
66
69
  stderr += text;
67
70
  });
68
71
  // exit
69
- proc.on('exit', (code) => {
72
+ proc.on("exit", (code) => {
70
73
  // if no source files found
71
74
  if (code === 2 && !stderr) {
72
75
  resolve();
73
76
  return;
74
77
  }
75
78
  if (code !== 0) {
76
- console.log(chalk.red('Error:'), code, stderr);
79
+ console.log(chalk.red("Error:"), code, stderr);
77
80
  process.exit(1);
78
81
  }
79
82
  resolve();
@@ -81,20 +84,18 @@ export async function docs(options = {}) {
81
84
  });
82
85
  // create archive
83
86
  if (archive) {
84
- let ignore = [
85
- `${docsDir}/**/*.test.adoc`,
86
- `${docsDir}/test/**/*`,
87
- ];
88
- let files = globSync(`${docsDir}/**/*.adoc`, { ignore }).map(f => path.relative(docsDir, f));
87
+ let ignore = [`${docsDir}/**/*.test.adoc`, `${docsDir}/test/**/*`];
88
+ let files = globSync(`${docsDir}/**/*.adoc`, { ignore }).map((f) => path.relative(docsDir, f));
89
89
  files.sort();
90
90
  if (files.length) {
91
91
  let stream = createTar({
92
92
  cwd: docsDir,
93
93
  gzip: true,
94
94
  portable: true,
95
- }, files).pipe(fs.createWriteStream(path.join(docsDir, 'docs.tgz')));
95
+ }, files).pipe(fs.createWriteStream(path.join(docsDir, "docs.tgz")));
96
96
  await streamToPromise(stream);
97
97
  }
98
98
  }
99
- silent || console.log(`${chalk.green('Documentation generated')} at ${docsDirRelative}`);
99
+ silent ||
100
+ console.log(`${chalk.green("Documentation generated")} at ${docsDirRelative}`);
100
101
  }
@@ -1,18 +1,18 @@
1
- import fs from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { globSync } from 'glob';
4
- import chalk from 'chalk';
5
- import * as prettier from 'prettier';
6
- import motokoPlugin from 'prettier-plugin-motoko';
7
- import { getRootDir } from '../mops.js';
8
- import { absToRel } from './test/utils.js';
9
- import { parallel } from '../parallel.js';
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { globSync } from "glob";
4
+ import chalk from "chalk";
5
+ import * as prettier from "prettier";
6
+ import motokoPlugin from "prettier-plugin-motoko";
7
+ import { getRootDir } from "../mops.js";
8
+ import { absToRel } from "./test/utils.js";
9
+ import { parallel } from "../parallel.js";
10
10
  let ignore = [
11
- '**/node_modules/**',
12
- '**/.mops/**',
13
- '**/.vessel/**',
14
- '**/.git/**',
15
- '**/dist/**',
11
+ "**/node_modules/**",
12
+ "**/.mops/**",
13
+ "**/.vessel/**",
14
+ "**/.git/**",
15
+ "**/dist/**",
16
16
  ];
17
17
  let globConfig = {
18
18
  nocase: true,
@@ -21,7 +21,7 @@ let globConfig = {
21
21
  export async function format(filter, options = {}, signal, onProgress) {
22
22
  let startTime = Date.now();
23
23
  let rootDir = getRootDir();
24
- let globStr = '**/*.mo';
24
+ let globStr = "**/*.mo";
25
25
  if (filter) {
26
26
  globStr = `**/*${filter}*.mo`;
27
27
  }
@@ -49,7 +49,7 @@ export async function format(filter, options = {}, signal, onProgress) {
49
49
  return getResult(false);
50
50
  }
51
51
  if (!options.silent) {
52
- console.log('No *.mo files found');
52
+ console.log("No *.mo files found");
53
53
  }
54
54
  return getResult(false);
55
55
  }
@@ -76,30 +76,34 @@ export async function format(filter, options = {}, signal, onProgress) {
76
76
  // }
77
77
  // add motoko parser plugin
78
78
  Object.assign(prettierConfig, {
79
- parser: 'motoko-tt-parse',
79
+ parser: "motoko-tt-parse",
80
80
  plugins: [motokoPlugin],
81
81
  filepath: file,
82
82
  });
83
83
  // check file
84
- let code = await fs.readFile(file, 'utf8');
84
+ let code = await fs.readFile(file, "utf8");
85
85
  let formatted = await prettier.format(code, prettierConfig);
86
86
  let ok = formatted === code;
87
87
  invalidFiles += Number(!ok);
88
88
  if (options.check) {
89
89
  if (ok) {
90
- options.silent || console.log(`${chalk.green('✓')} ${absToRel(file)} ${chalk.gray('valid')}`);
90
+ options.silent ||
91
+ console.log(`${chalk.green("✓")} ${absToRel(file)} ${chalk.gray("valid")}`);
91
92
  }
92
93
  else {
93
- options.silent || console.log(`${chalk.red('✖')} ${absToRel(file)} ${chalk.gray('invalid')}`);
94
+ options.silent ||
95
+ console.log(`${chalk.red("✖")} ${absToRel(file)} ${chalk.gray("invalid")}`);
94
96
  }
95
97
  }
96
98
  else {
97
99
  if (ok) {
98
- options.silent || console.log(`${chalk.green('✓')} ${absToRel(file)} ${chalk.gray('valid')}`);
100
+ options.silent ||
101
+ console.log(`${chalk.green("✓")} ${absToRel(file)} ${chalk.gray("valid")}`);
99
102
  }
100
103
  else {
101
104
  await fs.writeFile(file, formatted);
102
- options.silent || console.log(`${chalk.yellow('*')} ${absToRel(file)} ${chalk.gray('formatted')}`);
105
+ options.silent ||
106
+ console.log(`${chalk.yellow("*")} ${absToRel(file)} ${chalk.gray("formatted")}`);
103
107
  }
104
108
  }
105
109
  checkedFiles += 1;
@@ -110,9 +114,9 @@ export async function format(filter, options = {}, signal, onProgress) {
110
114
  return getResult(false);
111
115
  }
112
116
  if (!options.silent) {
113
- console.log('-'.repeat(50));
114
- let plural = (n) => n === 1 ? '' : 's';
115
- let str = `Checked ${chalk.gray(files.length)} file${plural(files.length)} in ${chalk.gray(((Date.now() - startTime) / 1000).toFixed(2) + 's')}`;
117
+ console.log("-".repeat(50));
118
+ let plural = (n) => (n === 1 ? "" : "s");
119
+ let str = `Checked ${chalk.gray(files.length)} file${plural(files.length)} in ${chalk.gray(((Date.now() - startTime) / 1000).toFixed(2) + "s")}`;
116
120
  if (invalidFiles) {
117
121
  str += options.check
118
122
  ? `, invalid ${chalk.redBright(invalidFiles)} file${plural(invalidFiles)}`
@@ -120,11 +124,11 @@ export async function format(filter, options = {}, signal, onProgress) {
120
124
  }
121
125
  console.log(str);
122
126
  if (!invalidFiles) {
123
- console.log(chalk.green('✓ All files have valid formatting'));
127
+ console.log(chalk.green("✓ All files have valid formatting"));
124
128
  }
125
129
  }
126
130
  if (options.check && invalidFiles && !options.silent) {
127
- console.log(`${(`Run '${chalk.yellow('mops format' + (filter ? ` ${filter}` : ''))}' to format your code`)}`);
131
+ console.log(`${`Run '${chalk.yellow("mops format" + (filter ? ` ${filter}` : ""))}' to format your code`}`);
128
132
  return getResult(false);
129
133
  }
130
134
  return getResult(true);