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,9 +1,9 @@
1
- import { execSync } from 'node:child_process';
1
+ import { execSync } from "node:child_process";
2
2
  export function getDfxVersion() {
3
3
  try {
4
- let res = execSync('dfx --version').toString();
5
- return res.trim().split('dfx ')[1] || '';
4
+ let res = execSync("dfx --version").toString();
5
+ return res.trim().split("dfx ")[1] || "";
6
6
  }
7
7
  catch { }
8
- return '';
8
+ return "";
9
9
  }
@@ -1,25 +1,26 @@
1
- import process from 'node:process';
2
- import { execFileSync } from 'node:child_process';
1
+ import process from "node:process";
2
+ import { execFileSync } from "node:child_process";
3
3
  export function getMocPath(throwIfNotFound = false) {
4
4
  let mocPath = process.env.DFX_MOC_PATH;
5
5
  if (!mocPath) {
6
6
  try {
7
- mocPath = execFileSync('dfx', ['cache', 'show']).toString().trim() + '/moc';
7
+ mocPath =
8
+ execFileSync("dfx", ["cache", "show"]).toString().trim() + "/moc";
8
9
  }
9
10
  catch (e) {
10
- mocPath = '';
11
+ mocPath = "";
11
12
  }
12
13
  }
13
14
  if (!mocPath) {
14
- mocPath = 'moc';
15
+ mocPath = "moc";
15
16
  }
16
17
  if (throwIfNotFound) {
17
18
  try {
18
- execFileSync(mocPath, ['--version']);
19
+ execFileSync(mocPath, ["--version"]);
19
20
  }
20
21
  catch (e) {
21
22
  console.error(e);
22
- throw new Error('moc not found');
23
+ throw new Error("moc not found");
23
24
  }
24
25
  }
25
26
  return mocPath;
@@ -1,19 +1,22 @@
1
- import { execFileSync } from 'node:child_process';
2
- import { getMocPath } from './get-moc-path.js';
1
+ import { execFileSync } from "node:child_process";
2
+ import { getMocPath } from "./get-moc-path.js";
3
3
  export function getMocVersion(throwOnError = false) {
4
4
  let mocPath = getMocPath(false);
5
5
  if (!mocPath) {
6
- return '';
6
+ return "";
7
7
  }
8
8
  try {
9
- let match = execFileSync(mocPath, ['--version']).toString().trim().match(/Motoko compiler ([^\s]+) .*/);
10
- return match?.[1] || '';
9
+ let match = execFileSync(mocPath, ["--version"])
10
+ .toString()
11
+ .trim()
12
+ .match(/Motoko compiler ([^\s]+) .*/);
13
+ return match?.[1] || "";
11
14
  }
12
15
  catch (e) {
13
16
  if (throwOnError) {
14
17
  console.error(e);
15
- throw new Error('moc not found');
18
+ throw new Error("moc not found");
16
19
  }
17
- return '';
20
+ return "";
18
21
  }
19
22
  }
@@ -1,4 +1,4 @@
1
- import { getDepName } from './get-dep-name.js';
1
+ import { getDepName } from "./get-dep-name.js";
2
2
  export function getPackageId(name, version) {
3
- return getDepName(name) + '@' + version;
3
+ return getDepName(name) + "@" + version;
4
4
  }
@@ -0,0 +1 @@
1
+ export declare function isCandidCompatible(newPath: string, originalPath: string): Promise<boolean>;
@@ -0,0 +1,20 @@
1
+ import { readFile, access } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getWasmBindings } from "../wasm.js";
4
+ export async function isCandidCompatible(newPath, originalPath) {
5
+ try {
6
+ await access(newPath);
7
+ }
8
+ catch {
9
+ throw new Error(`Candid file not found: ${newPath}`);
10
+ }
11
+ try {
12
+ await access(originalPath);
13
+ }
14
+ catch {
15
+ throw new Error(`Candid file not found: ${originalPath}`);
16
+ }
17
+ const newText = await readFile(path.resolve(newPath), "utf8");
18
+ const originalText = await readFile(path.resolve(originalPath), "utf8");
19
+ return getWasmBindings().is_candid_compatible(newText, originalText);
20
+ }
@@ -15,7 +15,7 @@ type LockFileV3 = {
15
15
  deps: Record<string, string>;
16
16
  };
17
17
  type LockFile = LockFileV1 | LockFileV2 | LockFileV3;
18
- export declare function checkIntegrity(lock?: 'check' | 'update' | 'ignore'): Promise<void>;
18
+ export declare function checkIntegrity(lock?: "check" | "update" | "ignore"): Promise<void>;
19
19
  export declare function getLocalFileHash(fileId: string): string;
20
20
  export declare function checkRemote(): Promise<void>;
21
21
  export declare function readLockFile(): LockFile | null;
package/dist/integrity.js CHANGED
@@ -1,25 +1,27 @@
1
- import process from 'node:process';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import { sha256 } from '@noble/hashes/sha256';
5
- import { bytesToHex } from '@noble/hashes/utils';
6
- import { getDependencyType, getRootDir, readConfig } from './mops.js';
7
- import { mainActor } from './api/actors.js';
8
- import { resolvePackages } from './resolve-packages.js';
9
- import { getPackageId } from './helpers/get-package-id.js';
1
+ import process from "node:process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { sha256 } from "@noble/hashes/sha256";
5
+ import { bytesToHex } from "@noble/hashes/utils";
6
+ import { getDependencyType, getRootDir, readConfig } from "./mops.js";
7
+ import { mainActor } from "./api/actors.js";
8
+ import { resolvePackages } from "./resolve-packages.js";
9
+ import { getPackageId } from "./helpers/get-package-id.js";
10
10
  export async function checkIntegrity(lock) {
11
11
  let force = !!lock;
12
- if (!lock && !process.env['CI'] && fs.existsSync(path.join(getRootDir(), 'mops.lock'))) {
13
- lock = 'update';
12
+ if (!lock &&
13
+ !process.env["CI"] &&
14
+ fs.existsSync(path.join(getRootDir(), "mops.lock"))) {
15
+ lock = "update";
14
16
  }
15
17
  if (!lock) {
16
- lock = process.env['CI'] ? 'check' : 'ignore';
18
+ lock = process.env["CI"] ? "check" : "ignore";
17
19
  }
18
- if (lock === 'update') {
20
+ if (lock === "update") {
19
21
  await updateLockFile();
20
22
  await checkLockFile(force);
21
23
  }
22
- else if (lock === 'check') {
24
+ else if (lock === "check") {
23
25
  await checkLockFile(force);
24
26
  }
25
27
  }
@@ -32,14 +34,14 @@ async function getFileHashesFromRegistry() {
32
34
  async function getResolvedMopsPackageIds() {
33
35
  let resolvedPackages = await resolvePackages();
34
36
  let packageIds = Object.entries(resolvedPackages)
35
- .filter(([_, version]) => getDependencyType(version) === 'mops')
37
+ .filter(([_, version]) => getDependencyType(version) === "mops")
36
38
  .map(([name, version]) => getPackageId(name, version));
37
39
  return packageIds;
38
40
  }
39
41
  // get hash of local file from '.mops' dir by fileId
40
42
  export function getLocalFileHash(fileId) {
41
43
  let rootDir = getRootDir();
42
- let file = path.join(rootDir, '.mops', fileId);
44
+ let file = path.join(rootDir, ".mops", fileId);
43
45
  if (!fs.existsSync(file)) {
44
46
  console.error(`Missing file ${fileId} in .mops dir`);
45
47
  process.exit(1);
@@ -48,16 +50,22 @@ export function getLocalFileHash(fileId) {
48
50
  return bytesToHex(sha256(fileData));
49
51
  }
50
52
  function getMopsTomlHash() {
51
- return bytesToHex(sha256(fs.readFileSync(getRootDir() + '/mops.toml')));
53
+ return bytesToHex(sha256(fs.readFileSync(getRootDir() + "/mops.toml")));
52
54
  }
53
55
  function getMopsTomlDepsHash() {
54
56
  let config = readConfig();
55
57
  let deps = config.dependencies || {};
56
- let devDeps = config['dev-dependencies'] || {};
58
+ let devDeps = config["dev-dependencies"] || {};
57
59
  let allDeps = { ...deps, ...devDeps };
58
60
  // sort allDeps by key
59
- let sortedDeps = Object.keys(allDeps).sort().reduce((acc, key) => {
60
- acc[key] = allDeps[key]?.version || allDeps[key]?.repo || allDeps[key]?.path || '';
61
+ let sortedDeps = Object.keys(allDeps)
62
+ .sort()
63
+ .reduce((acc, key) => {
64
+ acc[key] =
65
+ allDeps[key]?.version ||
66
+ allDeps[key]?.repo ||
67
+ allDeps[key]?.path ||
68
+ "";
61
69
  return acc;
62
70
  }, {});
63
71
  return bytesToHex(sha256(JSON.stringify(sortedDeps)));
@@ -71,7 +79,7 @@ export async function checkRemote() {
71
79
  let remoteHash = new Uint8Array(hash);
72
80
  let localHash = getLocalFileHash(fileId);
73
81
  if (localHash !== bytesToHex(remoteHash)) {
74
- console.error('Integrity check failed.');
82
+ console.error("Integrity check failed.");
75
83
  console.error(`Mismatched hash for ${fileId}: ${localHash} vs ${bytesToHex(remoteHash)}`);
76
84
  process.exit(1);
77
85
  }
@@ -80,7 +88,7 @@ export async function checkRemote() {
80
88
  }
81
89
  export function readLockFile() {
82
90
  let rootDir = getRootDir();
83
- let lockFile = path.join(rootDir, 'mops.lock');
91
+ let lockFile = path.join(rootDir, "mops.lock");
84
92
  if (fs.existsSync(lockFile)) {
85
93
  return JSON.parse(fs.readFileSync(lockFile).toString());
86
94
  }
@@ -91,7 +99,8 @@ export function checkLockFileLight() {
91
99
  let existingLockFileJson = readLockFile();
92
100
  if (existingLockFileJson) {
93
101
  let mopsTomlDepsHash = getMopsTomlDepsHash();
94
- if (existingLockFileJson.version === 3 && mopsTomlDepsHash === existingLockFileJson.mopsTomlDepsHash) {
102
+ if (existingLockFileJson.version === 3 &&
103
+ mopsTomlDepsHash === existingLockFileJson.mopsTomlDepsHash) {
95
104
  return true;
96
105
  }
97
106
  }
@@ -117,18 +126,18 @@ export async function updateLockFile() {
117
126
  }, {}),
118
127
  };
119
128
  let rootDir = getRootDir();
120
- let lockFile = path.join(rootDir, 'mops.lock');
129
+ let lockFile = path.join(rootDir, "mops.lock");
121
130
  fs.writeFileSync(lockFile, JSON.stringify(lockFileJson, null, 2));
122
131
  }
123
132
  // compare hashes of local files with hashes from the lock file
124
133
  export async function checkLockFile(force = false) {
125
134
  let supportedVersions = [1, 2, 3];
126
135
  let rootDir = getRootDir();
127
- let lockFile = path.join(rootDir, 'mops.lock');
136
+ let lockFile = path.join(rootDir, "mops.lock");
128
137
  // check if lock file exists
129
138
  if (!fs.existsSync(lockFile)) {
130
139
  if (force) {
131
- console.error('Missing lock file. Run `mops install` to generate it.');
140
+ console.error("Missing lock file. Run `mops install` to generate it.");
132
141
  process.exit(1);
133
142
  }
134
143
  return;
@@ -137,16 +146,16 @@ export async function checkLockFile(force = false) {
137
146
  let packageIds = await getResolvedMopsPackageIds();
138
147
  // check lock file version
139
148
  if (!supportedVersions.includes(lockFileJsonGeneric.version)) {
140
- console.error('Integrity check failed');
141
- console.error(`Invalid lock file version: ${lockFileJsonGeneric.version}. Supported versions: ${supportedVersions.join(', ')}`);
149
+ console.error("Integrity check failed");
150
+ console.error(`Invalid lock file version: ${lockFileJsonGeneric.version}. Supported versions: ${supportedVersions.join(", ")}`);
142
151
  process.exit(1);
143
152
  }
144
153
  let lockFileJson = lockFileJsonGeneric;
145
154
  // V1: check mops.toml hash
146
155
  if (lockFileJson.version === 1) {
147
156
  if (lockFileJson.mopsTomlHash !== getMopsTomlHash()) {
148
- console.error('Integrity check failed');
149
- console.error('Mismatched mops.toml hash');
157
+ console.error("Integrity check failed");
158
+ console.error("Mismatched mops.toml hash");
150
159
  console.error(`Locked hash: ${lockFileJson.mopsTomlHash}`);
151
160
  console.error(`Actual hash: ${getMopsTomlHash()}`);
152
161
  process.exit(1);
@@ -155,8 +164,8 @@ export async function checkLockFile(force = false) {
155
164
  // V2, V3: check mops.toml deps hash
156
165
  if (lockFileJson.version === 2 || lockFileJson.version === 3) {
157
166
  if (lockFileJson.mopsTomlDepsHash !== getMopsTomlDepsHash()) {
158
- console.error('Integrity check failed');
159
- console.error('Mismatched mops.toml dependencies hash');
167
+ console.error("Integrity check failed");
168
+ console.error("Mismatched mops.toml dependencies hash");
160
169
  console.error(`Locked hash: ${lockFileJson.mopsTomlDepsHash}`);
161
170
  console.error(`Actual hash: ${getMopsTomlDepsHash()}`);
162
171
  process.exit(1);
@@ -168,7 +177,7 @@ export async function checkLockFile(force = false) {
168
177
  let resolvedDeps = await resolvePackages();
169
178
  for (let name of Object.keys(resolvedDeps)) {
170
179
  if (lockedDeps[name] !== resolvedDeps[name]) {
171
- console.error('Integrity check failed');
180
+ console.error("Integrity check failed");
172
181
  console.error(`Mismatched package ${name}`);
173
182
  console.error(`Locked: ${lockedDeps[name]}`);
174
183
  console.error(`Actual: ${resolvedDeps[name]}`);
@@ -178,14 +187,14 @@ export async function checkLockFile(force = false) {
178
187
  }
179
188
  // check number of packages
180
189
  if (Object.keys(lockFileJson.hashes).length !== packageIds.length) {
181
- console.error('Integrity check failed');
190
+ console.error("Integrity check failed");
182
191
  console.error(`Mismatched number of resolved packages: ${JSON.stringify(Object.keys(lockFileJson.hashes).length)} vs ${JSON.stringify(packageIds.length)}`);
183
192
  process.exit(1);
184
193
  }
185
194
  // check if resolved packages are in the lock file
186
195
  for (let packageId of packageIds) {
187
196
  if (!(packageId in lockFileJson.hashes)) {
188
- console.error('Integrity check failed');
197
+ console.error("Integrity check failed");
189
198
  console.error(`Missing package ${packageId} in lock file`);
190
199
  process.exit(1);
191
200
  }
@@ -193,21 +202,21 @@ export async function checkLockFile(force = false) {
193
202
  for (let [packageId, hashes] of Object.entries(lockFileJson.hashes)) {
194
203
  // check if package is in resolved packages
195
204
  if (!packageIds.includes(packageId)) {
196
- console.error('Integrity check failed');
205
+ console.error("Integrity check failed");
197
206
  console.error(`Package ${packageId} in lock file but not in resolved packages`);
198
207
  process.exit(1);
199
208
  }
200
209
  for (let [fileId, lockedHash] of Object.entries(hashes)) {
201
210
  // check if file belongs to package
202
211
  if (!fileId.startsWith(packageId)) {
203
- console.error('Integrity check failed');
212
+ console.error("Integrity check failed");
204
213
  console.error(`File ${fileId} in lock file does not belong to package ${packageId}`);
205
214
  process.exit(1);
206
215
  }
207
216
  // local file hash vs hash from lock file
208
217
  let localHash = getLocalFileHash(fileId);
209
218
  if (lockedHash !== localHash) {
210
- console.error('Integrity check failed');
219
+ console.error("Integrity check failed");
211
220
  console.error(`Mismatched hash for ${fileId}`);
212
221
  console.error(`Locked hash: ${lockedHash}`);
213
222
  console.error(`Actual hash: ${localHash}`);
@@ -0,0 +1,11 @@
1
+ declare const _default: {
2
+ preset: string;
3
+ testPathIgnorePatterns: string[];
4
+ transform: {
5
+ "^.+\\.tsx?$": [string, {
6
+ useESM: boolean;
7
+ }];
8
+ };
9
+ testTimeout: number;
10
+ };
11
+ export default _default;
@@ -0,0 +1,14 @@
1
+ /** @type {import("jest").Config} **/
2
+ export default {
3
+ preset: "ts-jest/presets/default-esm",
4
+ testPathIgnorePatterns: [
5
+ "<rootDir>/node_modules/",
6
+ "<rootDir>/dist/",
7
+ "<rootDir>/bundle/",
8
+ "<rootDir>/commands/"
9
+ ],
10
+ transform: {
11
+ "^.+\\.tsx?$": ["ts-jest", { useESM: true }],
12
+ },
13
+ testTimeout: 60000,
14
+ };
package/dist/mops.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { Identity } from '@icp-sdk/core/agent';
2
- import { Config, Dependency } from './types.js';
3
- import { mainActor, storageActor } from './api/actors.js';
4
- import { getNetwork } from './api/network.js';
5
- import { getHighestVersion } from './api/getHighestVersion.js';
1
+ import { Identity } from "@icp-sdk/core/agent";
2
+ import { Config, Dependency } from "./types.js";
3
+ import { mainActor, storageActor } from "./api/actors.js";
4
+ import { getNetwork } from "./api/network.js";
5
+ import { getHighestVersion } from "./api/getHighestVersion.js";
6
6
  export declare let apiVersion: string;
7
7
  export declare let globalConfigDir: string;
8
8
  export declare let globalCacheDir: string;
@@ -29,4 +29,4 @@ export declare function formatGithubDir(name: string, repo: string): string;
29
29
  export declare function readDfxJson(): any;
30
30
  export declare function checkApiCompatibility(): Promise<boolean>;
31
31
  export declare function version(): any;
32
- export { getNetwork, mainActor, storageActor, getHighestVersion, };
32
+ export { getNetwork, mainActor, storageActor, getHighestVersion };