ic-mops 1.11.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/.DS_Store +0 -0
  2. package/.eslintrc.json +7 -7
  3. package/CHANGELOG.md +15 -0
  4. package/api/actors.ts +41 -37
  5. package/api/downloadPackageFiles.ts +75 -61
  6. package/api/getHighestVersion.ts +5 -5
  7. package/api/index.ts +4 -4
  8. package/api/network.ts +19 -21
  9. package/api/resolveVersion.ts +14 -11
  10. package/bin/mops.js +1 -1
  11. package/bun.lock +234 -198
  12. package/bundle/bench/bench-canister.mo +2 -2
  13. package/bundle/bench/user-bench.mo +0 -4
  14. package/bundle/bin/mops.js +1 -1
  15. package/bundle/cli.js +1000 -924
  16. package/bundle/cli.tgz +0 -0
  17. package/bundle/declarations/bench/bench.did +3 -3
  18. package/bundle/declarations/bench/bench.did.d.ts +3 -3
  19. package/bundle/declarations/bench/index.d.ts +3 -3
  20. package/bundle/declarations/bench/index.js +1 -1
  21. package/bundle/declarations/main/index.d.ts +3 -3
  22. package/bundle/declarations/main/index.js +1 -1
  23. package/bundle/declarations/main/main.did +78 -121
  24. package/bundle/declarations/main/main.did.d.ts +48 -98
  25. package/bundle/declarations/main/main.did.js +53 -107
  26. package/bundle/declarations/storage/index.d.ts +3 -3
  27. package/bundle/declarations/storage/index.js +4 -4
  28. package/bundle/declarations/storage/storage.did.d.ts +3 -3
  29. package/bundle/package.json +6 -5
  30. package/bundle/templates/mops-publish.yml +3 -3
  31. package/bundle/templates/mops-test.yml +3 -3
  32. package/bundle-package-json.ts +8 -8
  33. package/cache.ts +80 -65
  34. package/check-requirements.ts +49 -45
  35. package/cli.ts +577 -376
  36. package/commands/add.ts +142 -129
  37. package/commands/available-updates.ts +55 -28
  38. package/commands/bench/bench-canister.mo +114 -108
  39. package/commands/bench/user-bench.mo +6 -6
  40. package/commands/bench-replica.ts +146 -106
  41. package/commands/bench.ts +563 -497
  42. package/commands/build.ts +177 -0
  43. package/commands/bump.ts +68 -57
  44. package/commands/check-candid.ts +24 -0
  45. package/commands/docs-coverage.ts +124 -102
  46. package/commands/docs.ts +118 -108
  47. package/commands/format.ts +171 -155
  48. package/commands/init.ts +301 -275
  49. package/commands/install/install-all.ts +75 -62
  50. package/commands/install/install-dep.ts +43 -28
  51. package/commands/install/install-deps.ts +23 -15
  52. package/commands/install/install-local-dep.ts +42 -34
  53. package/commands/install/install-mops-dep.ts +154 -123
  54. package/commands/install/sync-local-cache.ts +39 -35
  55. package/commands/maintainer.ts +109 -99
  56. package/commands/outdated.ts +31 -18
  57. package/commands/owner.ts +107 -99
  58. package/commands/publish.ts +534 -443
  59. package/commands/remove.ts +119 -89
  60. package/commands/replica.ts +391 -303
  61. package/commands/search.ts +42 -36
  62. package/commands/self.ts +63 -56
  63. package/commands/sources.ts +66 -49
  64. package/commands/sync.ts +92 -75
  65. package/commands/template.ts +145 -102
  66. package/commands/test/mmf1.ts +146 -119
  67. package/commands/test/reporters/compact-reporter.ts +87 -84
  68. package/commands/test/reporters/files-reporter.ts +56 -51
  69. package/commands/test/reporters/reporter.ts +12 -6
  70. package/commands/test/reporters/silent-reporter.ts +58 -59
  71. package/commands/test/reporters/verbose-reporter.ts +66 -54
  72. package/commands/test/test.ts +497 -460
  73. package/commands/test/utils.ts +85 -6
  74. package/commands/toolchain/index.ts +363 -322
  75. package/commands/toolchain/moc.ts +78 -50
  76. package/commands/toolchain/pocket-ic.ts +41 -34
  77. package/commands/toolchain/toolchain-utils.ts +92 -72
  78. package/commands/toolchain/wasmtime.ts +37 -34
  79. package/commands/update.ts +91 -56
  80. package/commands/user.ts +90 -81
  81. package/commands/watch/deployer.ts +188 -152
  82. package/commands/watch/error-checker.ts +90 -80
  83. package/commands/watch/formatter.ts +72 -60
  84. package/commands/watch/generator.ts +116 -96
  85. package/commands/watch/globMoFiles.ts +13 -13
  86. package/commands/watch/parseDfxJson.ts +63 -57
  87. package/commands/watch/tester.ts +83 -65
  88. package/commands/watch/warning-checker.ts +149 -136
  89. package/commands/watch/watch.ts +123 -95
  90. package/declarations/bench/bench.did.d.ts +3 -3
  91. package/declarations/bench/index.d.ts +3 -3
  92. package/declarations/bench/index.js +1 -1
  93. package/declarations/main/index.d.ts +3 -3
  94. package/declarations/main/index.js +1 -1
  95. package/declarations/main/main.did.d.ts +3 -3
  96. package/declarations/storage/index.d.ts +3 -3
  97. package/declarations/storage/index.js +4 -4
  98. package/declarations/storage/storage.did.d.ts +3 -3
  99. package/dist/api/actors.d.ts +4 -4
  100. package/dist/api/actors.js +8 -8
  101. package/dist/api/downloadPackageFiles.d.ts +2 -2
  102. package/dist/api/downloadPackageFiles.js +10 -10
  103. package/dist/api/getHighestVersion.js +1 -1
  104. package/dist/api/index.d.ts +4 -4
  105. package/dist/api/index.js +4 -4
  106. package/dist/api/network.js +9 -9
  107. package/dist/api/resolveVersion.js +3 -3
  108. package/dist/bin/mops.js +1 -1
  109. package/dist/bundle-package-json.js +8 -8
  110. package/dist/cache.js +22 -17
  111. package/dist/check-requirements.js +11 -11
  112. package/dist/cli.js +283 -186
  113. package/dist/commands/add.d.ts +1 -1
  114. package/dist/commands/add.js +41 -38
  115. package/dist/commands/available-updates.d.ts +1 -1
  116. package/dist/commands/available-updates.js +32 -14
  117. package/dist/commands/bench/bench-canister.mo +114 -108
  118. package/dist/commands/bench/user-bench.mo +6 -6
  119. package/dist/commands/bench-replica.d.ts +6 -5
  120. package/dist/commands/bench-replica.js +58 -36
  121. package/dist/commands/bench.d.ts +5 -5
  122. package/dist/commands/bench.js +134 -118
  123. package/dist/commands/build.d.ts +7 -0
  124. package/dist/commands/build.js +121 -0
  125. package/dist/commands/bump.js +27 -18
  126. package/dist/commands/check-candid.d.ts +4 -0
  127. package/dist/commands/check-candid.js +15 -0
  128. package/dist/commands/docs-coverage.d.ts +1 -1
  129. package/dist/commands/docs-coverage.js +45 -31
  130. package/dist/commands/docs.d.ts +1 -1
  131. package/dist/commands/docs.js +39 -38
  132. package/dist/commands/format.js +31 -27
  133. package/dist/commands/init.js +102 -92
  134. package/dist/commands/install/install-all.d.ts +2 -2
  135. package/dist/commands/install/install-all.js +23 -21
  136. package/dist/commands/install/install-dep.d.ts +1 -1
  137. package/dist/commands/install/install-dep.js +21 -8
  138. package/dist/commands/install/install-deps.d.ts +1 -1
  139. package/dist/commands/install/install-deps.js +1 -1
  140. package/dist/commands/install/install-local-dep.js +11 -9
  141. package/dist/commands/install/install-mops-dep.d.ts +1 -1
  142. package/dist/commands/install/install-mops-dep.js +32 -27
  143. package/dist/commands/install/sync-local-cache.js +10 -10
  144. package/dist/commands/maintainer.js +21 -21
  145. package/dist/commands/outdated.js +16 -6
  146. package/dist/commands/owner.js +21 -21
  147. package/dist/commands/publish.js +148 -128
  148. package/dist/commands/remove.d.ts +1 -1
  149. package/dist/commands/remove.js +42 -30
  150. package/dist/commands/replica.d.ts +9 -8
  151. package/dist/commands/replica.js +105 -65
  152. package/dist/commands/search.js +15 -13
  153. package/dist/commands/self.js +31 -28
  154. package/dist/commands/sources.d.ts +5 -1
  155. package/dist/commands/sources.js +23 -17
  156. package/dist/commands/sync.d.ts +1 -1
  157. package/dist/commands/sync.js +38 -25
  158. package/dist/commands/template.js +66 -56
  159. package/dist/commands/test/mmf1.d.ts +3 -3
  160. package/dist/commands/test/mmf1.js +33 -31
  161. package/dist/commands/test/reporters/compact-reporter.d.ts +3 -3
  162. package/dist/commands/test/reporters/compact-reporter.js +19 -15
  163. package/dist/commands/test/reporters/files-reporter.d.ts +3 -3
  164. package/dist/commands/test/reporters/files-reporter.js +18 -14
  165. package/dist/commands/test/reporters/reporter.d.ts +2 -2
  166. package/dist/commands/test/reporters/silent-reporter.d.ts +3 -3
  167. package/dist/commands/test/reporters/silent-reporter.js +4 -4
  168. package/dist/commands/test/reporters/verbose-reporter.d.ts +3 -3
  169. package/dist/commands/test/reporters/verbose-reporter.js +17 -13
  170. package/dist/commands/test/test.d.ts +4 -4
  171. package/dist/commands/test/test.js +151 -181
  172. package/dist/commands/test/utils.d.ts +6 -0
  173. package/dist/commands/test/utils.js +63 -2
  174. package/dist/commands/toolchain/index.d.ts +1 -1
  175. package/dist/commands/toolchain/index.js +81 -69
  176. package/dist/commands/toolchain/moc.d.ts +1 -1
  177. package/dist/commands/toolchain/moc.js +48 -24
  178. package/dist/commands/toolchain/pocket-ic.js +12 -12
  179. package/dist/commands/toolchain/toolchain-utils.d.ts +2 -0
  180. package/dist/commands/toolchain/toolchain-utils.js +32 -23
  181. package/dist/commands/toolchain/wasmtime.js +11 -11
  182. package/dist/commands/update.d.ts +1 -1
  183. package/dist/commands/update.js +30 -12
  184. package/dist/commands/user.js +31 -28
  185. package/dist/commands/watch/deployer.d.ts +4 -4
  186. package/dist/commands/watch/deployer.js +45 -36
  187. package/dist/commands/watch/error-checker.d.ts +2 -2
  188. package/dist/commands/watch/error-checker.js +27 -27
  189. package/dist/commands/watch/formatter.d.ts +4 -4
  190. package/dist/commands/watch/formatter.js +17 -17
  191. package/dist/commands/watch/generator.d.ts +3 -3
  192. package/dist/commands/watch/generator.js +28 -23
  193. package/dist/commands/watch/globMoFiles.js +8 -8
  194. package/dist/commands/watch/parseDfxJson.d.ts +2 -2
  195. package/dist/commands/watch/parseDfxJson.js +9 -9
  196. package/dist/commands/watch/tester.d.ts +4 -4
  197. package/dist/commands/watch/tester.js +23 -21
  198. package/dist/commands/watch/warning-checker.d.ts +3 -3
  199. package/dist/commands/watch/warning-checker.js +36 -36
  200. package/dist/commands/watch/watch.js +45 -32
  201. package/dist/declarations/bench/bench.did.d.ts +3 -3
  202. package/dist/declarations/bench/index.d.ts +3 -3
  203. package/dist/declarations/bench/index.js +1 -1
  204. package/dist/declarations/main/index.d.ts +3 -3
  205. package/dist/declarations/main/index.js +1 -1
  206. package/dist/declarations/main/main.did.d.ts +3 -3
  207. package/dist/declarations/storage/index.d.ts +3 -3
  208. package/dist/declarations/storage/index.js +4 -4
  209. package/dist/declarations/storage/storage.did.d.ts +3 -3
  210. package/dist/environments/nodejs/cli.d.ts +1 -0
  211. package/dist/environments/nodejs/cli.js +4 -0
  212. package/dist/environments/web/cli.d.ts +1 -0
  213. package/dist/environments/web/cli.js +4 -0
  214. package/dist/error.d.ts +1 -0
  215. package/dist/error.js +5 -0
  216. package/dist/fix-dist.js +5 -5
  217. package/dist/helpers/find-changelog-entry.js +8 -5
  218. package/dist/helpers/get-dep-name.d.ts +1 -0
  219. package/dist/helpers/get-dep-name.js +4 -1
  220. package/dist/helpers/get-dfx-version.js +4 -4
  221. package/dist/helpers/get-moc-path.js +8 -7
  222. package/dist/helpers/get-moc-version.js +10 -7
  223. package/dist/helpers/get-package-id.js +2 -2
  224. package/dist/helpers/is-candid-compatible.d.ts +1 -0
  225. package/dist/helpers/is-candid-compatible.js +20 -0
  226. package/dist/integrity.d.ts +1 -1
  227. package/dist/integrity.js +47 -38
  228. package/dist/jest.config.d.ts +11 -0
  229. package/dist/jest.config.js +14 -0
  230. package/dist/mops.d.ts +6 -6
  231. package/dist/mops.js +87 -80
  232. package/dist/notify-installs.js +4 -4
  233. package/dist/package.json +11 -10
  234. package/dist/pem.d.ts +3 -3
  235. package/dist/pem.js +20 -12
  236. package/dist/release-cli.js +20 -20
  237. package/dist/resolve-packages.d.ts +1 -1
  238. package/dist/resolve-packages.js +52 -36
  239. package/dist/templates/mops-publish.yml +3 -3
  240. package/dist/templates/mops-test.yml +3 -3
  241. package/dist/templates/src/lib.mo +13 -13
  242. package/dist/templates/test/lib.test.mo +2 -2
  243. package/dist/templates.js +1 -1
  244. package/dist/tests/cli.test.d.ts +1 -0
  245. package/dist/tests/cli.test.js +63 -0
  246. package/dist/types.d.ts +14 -4
  247. package/dist/vessel.d.ts +2 -2
  248. package/dist/vessel.js +41 -34
  249. package/dist/wasm/pkg/bundler/package.json +20 -0
  250. package/dist/wasm/pkg/bundler/wasm.d.ts +3 -0
  251. package/dist/wasm/pkg/bundler/wasm.js +5 -0
  252. package/dist/wasm/pkg/bundler/wasm_bg.js +93 -0
  253. package/dist/wasm/pkg/bundler/wasm_bg.wasm +0 -0
  254. package/dist/wasm/pkg/bundler/wasm_bg.wasm.d.ts +8 -0
  255. package/dist/wasm/pkg/nodejs/package.json +14 -0
  256. package/dist/wasm/pkg/nodejs/wasm.d.ts +3 -0
  257. package/dist/wasm/pkg/nodejs/wasm.js +98 -0
  258. package/dist/wasm/pkg/nodejs/wasm_bg.wasm +0 -0
  259. package/dist/wasm/pkg/nodejs/wasm_bg.wasm.d.ts +8 -0
  260. package/dist/wasm/pkg/web/package.json +18 -0
  261. package/dist/wasm/pkg/web/wasm.d.ts +35 -0
  262. package/dist/wasm/pkg/web/wasm.js +191 -0
  263. package/dist/wasm/pkg/web/wasm_bg.wasm +0 -0
  264. package/dist/wasm/pkg/web/wasm_bg.wasm.d.ts +8 -0
  265. package/dist/wasm.d.ts +5 -0
  266. package/dist/wasm.js +10 -0
  267. package/environments/nodejs/cli.ts +6 -0
  268. package/environments/web/cli.ts +6 -0
  269. package/error.ts +6 -0
  270. package/fix-dist.ts +5 -5
  271. package/global.d.ts +3 -3
  272. package/helpers/find-changelog-entry.ts +26 -23
  273. package/helpers/get-dep-name.ts +7 -3
  274. package/helpers/get-dfx-version.ts +8 -9
  275. package/helpers/get-moc-path.ts +25 -26
  276. package/helpers/get-moc-version.ts +21 -19
  277. package/helpers/get-package-id.ts +4 -4
  278. package/helpers/is-candid-compatible.ts +22 -0
  279. package/integrity.ts +270 -236
  280. package/jest.config.js +14 -0
  281. package/mops.ts +238 -215
  282. package/notify-installs.ts +16 -17
  283. package/package.json +21 -15
  284. package/parallel.ts +28 -24
  285. package/pem.ts +55 -47
  286. package/release-cli.ts +73 -39
  287. package/resolve-packages.ts +231 -189
  288. package/templates/mops-publish.yml +3 -3
  289. package/templates/mops-test.yml +3 -3
  290. package/templates/src/lib.mo +13 -13
  291. package/templates/test/lib.test.mo +2 -2
  292. package/templates.ts +4 -4
  293. package/tests/__snapshots__/cli.test.ts.snap +202 -0
  294. package/tests/build/error/candid/bar.did +3 -0
  295. package/tests/build/error/dfx.json +12 -0
  296. package/tests/build/error/mops.toml +9 -0
  297. package/tests/build/error/src/Bar.mo +5 -0
  298. package/tests/build/error/src/Foo.mo +5 -0
  299. package/tests/build/success/.dfx/local/canister_ids.json +17 -0
  300. package/tests/build/success/.dfx/local/canisters/bar/bar.did +3 -0
  301. package/tests/build/success/.dfx/local/canisters/bar/bar.most +4 -0
  302. package/tests/build/success/.dfx/local/canisters/bar/bar.wasm +0 -0
  303. package/tests/build/success/.dfx/local/canisters/bar/constructor.did +3 -0
  304. package/tests/build/success/.dfx/local/canisters/bar/index.js +42 -0
  305. package/tests/build/success/.dfx/local/canisters/bar/init_args.txt +1 -0
  306. package/tests/build/success/.dfx/local/canisters/bar/service.did +3 -0
  307. package/tests/build/success/.dfx/local/canisters/bar/service.did.d.ts +7 -0
  308. package/tests/build/success/.dfx/local/canisters/bar/service.did.js +4 -0
  309. package/tests/build/success/.dfx/local/canisters/foo/constructor.did +3 -0
  310. package/tests/build/success/.dfx/local/canisters/foo/foo.did +3 -0
  311. package/tests/build/success/.dfx/local/canisters/foo/foo.most +4 -0
  312. package/tests/build/success/.dfx/local/canisters/foo/foo.wasm +0 -0
  313. package/tests/build/success/.dfx/local/canisters/foo/index.js +42 -0
  314. package/tests/build/success/.dfx/local/canisters/foo/init_args.txt +1 -0
  315. package/tests/build/success/.dfx/local/canisters/foo/service.did +3 -0
  316. package/tests/build/success/.dfx/local/canisters/foo/service.did.d.ts +7 -0
  317. package/tests/build/success/.dfx/local/canisters/foo/service.did.js +4 -0
  318. package/tests/build/success/.dfx/local/lsp/ucwa4-rx777-77774-qaada-cai.did +3 -0
  319. package/tests/build/success/.dfx/local/lsp/ulvla-h7777-77774-qaacq-cai.did +3 -0
  320. package/tests/build/success/.dfx/local/network-id +4 -0
  321. package/tests/build/success/candid/bar.did +3 -0
  322. package/tests/build/success/dfx.json +12 -0
  323. package/tests/build/success/mops.toml +9 -0
  324. package/tests/build/success/src/Bar.mo +5 -0
  325. package/tests/build/success/src/Foo.mo +5 -0
  326. package/tests/check-candid/a.did +3 -0
  327. package/tests/check-candid/b.did +5 -0
  328. package/tests/check-candid/c.did +3 -0
  329. package/tests/cli.test.ts +82 -0
  330. package/tsconfig.json +26 -19
  331. package/types.ts +41 -31
  332. package/vessel.ts +219 -187
  333. package/wasm/Cargo.lock +1475 -0
  334. package/wasm/Cargo.toml +28 -0
  335. package/wasm/pkg/bundler/package.json +20 -0
  336. package/wasm/pkg/bundler/wasm.d.ts +3 -0
  337. package/wasm/pkg/bundler/wasm.js +5 -0
  338. package/wasm/pkg/bundler/wasm_bg.js +93 -0
  339. package/wasm/pkg/bundler/wasm_bg.wasm +0 -0
  340. package/wasm/pkg/bundler/wasm_bg.wasm.d.ts +8 -0
  341. package/wasm/pkg/nodejs/package.json +14 -0
  342. package/wasm/pkg/nodejs/wasm.d.ts +3 -0
  343. package/wasm/pkg/nodejs/wasm.js +98 -0
  344. package/wasm/pkg/nodejs/wasm_bg.wasm +0 -0
  345. package/wasm/pkg/nodejs/wasm_bg.wasm.d.ts +8 -0
  346. package/wasm/pkg/web/package.json +18 -0
  347. package/wasm/pkg/web/wasm.d.ts +35 -0
  348. package/wasm/pkg/web/wasm.js +191 -0
  349. package/wasm/pkg/web/wasm_bg.wasm +0 -0
  350. package/wasm/pkg/web/wasm_bg.wasm.d.ts +8 -0
  351. package/wasm/src/lib.rs +17 -0
  352. package/wasm.ts +16 -0
@@ -0,0 +1,22 @@
1
+ import { readFile, access } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getWasmBindings } from "../wasm.js";
4
+
5
+ export async function isCandidCompatible(
6
+ newPath: string,
7
+ originalPath: string,
8
+ ): Promise<boolean> {
9
+ try {
10
+ await access(newPath);
11
+ } catch {
12
+ throw new Error(`Candid file not found: ${newPath}`);
13
+ }
14
+ try {
15
+ await access(originalPath);
16
+ } catch {
17
+ throw new Error(`Candid file not found: ${originalPath}`);
18
+ }
19
+ const newText = await readFile(path.resolve(newPath), "utf8");
20
+ const originalText = await readFile(path.resolve(originalPath), "utf8");
21
+ return getWasmBindings().is_candid_compatible(newText, originalText);
22
+ }
package/integrity.ts CHANGED
@@ -1,278 +1,312 @@
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
 
11
11
  type LockFileGeneric = {
12
- version : number;
12
+ version: number;
13
13
  };
14
14
 
15
15
  type LockFileV1 = {
16
- version : 1;
17
- mopsTomlHash : string;
18
- hashes : Record<string, Record<string, string>>;
16
+ version: 1;
17
+ mopsTomlHash: string;
18
+ hashes: Record<string, Record<string, string>>;
19
19
  };
20
20
 
21
21
  type LockFileV2 = {
22
- version : 2;
23
- mopsTomlDepsHash : string;
24
- hashes : Record<string, Record<string, string>>;
22
+ version: 2;
23
+ mopsTomlDepsHash: string;
24
+ hashes: Record<string, Record<string, string>>;
25
25
  };
26
26
 
27
27
  type LockFileV3 = {
28
- version : 3;
29
- mopsTomlDepsHash : string;
30
- hashes : Record<string, Record<string, string>>;
31
- deps : Record<string, string>;
28
+ version: 3;
29
+ mopsTomlDepsHash: string;
30
+ hashes: Record<string, Record<string, string>>;
31
+ deps: Record<string, string>;
32
32
  };
33
33
 
34
34
  type LockFile = LockFileV1 | LockFileV2 | LockFileV3;
35
35
 
36
- export async function checkIntegrity(lock ?: 'check' | 'update' | 'ignore') {
37
- let force = !!lock;
38
-
39
- if (!lock && !process.env['CI'] && fs.existsSync(path.join(getRootDir(), 'mops.lock'))) {
40
- lock = 'update';
41
- }
42
-
43
- if (!lock) {
44
- lock = process.env['CI'] ? 'check' : 'ignore';
45
- }
46
-
47
- if (lock === 'update') {
48
- await updateLockFile();
49
- await checkLockFile(force);
50
- }
51
- else if (lock === 'check') {
52
- await checkLockFile(force);
53
- }
36
+ export async function checkIntegrity(lock?: "check" | "update" | "ignore") {
37
+ let force = !!lock;
38
+
39
+ if (
40
+ !lock &&
41
+ !process.env["CI"] &&
42
+ fs.existsSync(path.join(getRootDir(), "mops.lock"))
43
+ ) {
44
+ lock = "update";
45
+ }
46
+
47
+ if (!lock) {
48
+ lock = process.env["CI"] ? "check" : "ignore";
49
+ }
50
+
51
+ if (lock === "update") {
52
+ await updateLockFile();
53
+ await checkLockFile(force);
54
+ } else if (lock === "check") {
55
+ await checkLockFile(force);
56
+ }
54
57
  }
55
58
 
56
- async function getFileHashesFromRegistry() : Promise<[string, [string, Uint8Array | number[]][]][]> {
57
- let packageIds = await getResolvedMopsPackageIds();
58
- let actor = await mainActor();
59
- let fileHashesByPackageIds = await actor.getFileHashesByPackageIds(packageIds);
60
- return fileHashesByPackageIds;
59
+ async function getFileHashesFromRegistry(): Promise<
60
+ [string, [string, Uint8Array | number[]][]][]
61
+ > {
62
+ let packageIds = await getResolvedMopsPackageIds();
63
+ let actor = await mainActor();
64
+ let fileHashesByPackageIds =
65
+ await actor.getFileHashesByPackageIds(packageIds);
66
+ return fileHashesByPackageIds;
61
67
  }
62
68
 
63
- async function getResolvedMopsPackageIds() : Promise<string[]> {
64
- let resolvedPackages = await resolvePackages();
65
- let packageIds = Object.entries(resolvedPackages)
66
- .filter(([_, version]) => getDependencyType(version) === 'mops')
67
- .map(([name, version]) => getPackageId(name, version));
68
- return packageIds;
69
+ async function getResolvedMopsPackageIds(): Promise<string[]> {
70
+ let resolvedPackages = await resolvePackages();
71
+ let packageIds = Object.entries(resolvedPackages)
72
+ .filter(([_, version]) => getDependencyType(version) === "mops")
73
+ .map(([name, version]) => getPackageId(name, version));
74
+ return packageIds;
69
75
  }
70
76
 
71
77
  // get hash of local file from '.mops' dir by fileId
72
- export function getLocalFileHash(fileId : string) : string {
73
- let rootDir = getRootDir();
74
- let file = path.join(rootDir, '.mops', fileId);
75
- if (!fs.existsSync(file)) {
76
- console.error(`Missing file ${fileId} in .mops dir`);
77
- process.exit(1);
78
- }
79
- let fileData = fs.readFileSync(file);
80
- return bytesToHex(sha256(fileData));
78
+ export function getLocalFileHash(fileId: string): string {
79
+ let rootDir = getRootDir();
80
+ let file = path.join(rootDir, ".mops", fileId);
81
+ if (!fs.existsSync(file)) {
82
+ console.error(`Missing file ${fileId} in .mops dir`);
83
+ process.exit(1);
84
+ }
85
+ let fileData = fs.readFileSync(file);
86
+ return bytesToHex(sha256(fileData));
81
87
  }
82
88
 
83
- function getMopsTomlHash() : string {
84
- return bytesToHex(sha256(fs.readFileSync(getRootDir() + '/mops.toml')));
89
+ function getMopsTomlHash(): string {
90
+ return bytesToHex(sha256(fs.readFileSync(getRootDir() + "/mops.toml")));
85
91
  }
86
92
 
87
- function getMopsTomlDepsHash() : string {
88
- let config = readConfig();
89
- let deps = config.dependencies || {};
90
- let devDeps = config['dev-dependencies'] || {};
91
- let allDeps = {...deps, ...devDeps};
92
- // sort allDeps by key
93
- let sortedDeps = Object.keys(allDeps).sort().reduce((acc, key) => {
94
- acc[key] = allDeps[key]?.version || allDeps[key]?.repo || allDeps[key]?.path || '';
95
- return acc;
96
- }, {} as Record<string, string>);
97
- return bytesToHex(sha256(JSON.stringify(sortedDeps)));
93
+ function getMopsTomlDepsHash(): string {
94
+ let config = readConfig();
95
+ let deps = config.dependencies || {};
96
+ let devDeps = config["dev-dependencies"] || {};
97
+ let allDeps = { ...deps, ...devDeps };
98
+ // sort allDeps by key
99
+ let sortedDeps = Object.keys(allDeps)
100
+ .sort()
101
+ .reduce(
102
+ (acc, key) => {
103
+ acc[key] =
104
+ allDeps[key]?.version ||
105
+ allDeps[key]?.repo ||
106
+ allDeps[key]?.path ||
107
+ "";
108
+ return acc;
109
+ },
110
+ {} as Record<string, string>,
111
+ );
112
+ return bytesToHex(sha256(JSON.stringify(sortedDeps)));
98
113
  }
99
114
 
100
115
  // compare hashes of local files with hashes from the registry
101
116
  export async function checkRemote() {
102
- let fileHashesFromRegistry = await getFileHashesFromRegistry();
103
-
104
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
105
- for (let [_packageId, fileHashes] of fileHashesFromRegistry) {
106
- for (let [fileId, hash] of fileHashes) {
107
- let remoteHash = new Uint8Array(hash);
108
- let localHash = getLocalFileHash(fileId);
109
-
110
- if (localHash !== bytesToHex(remoteHash)) {
111
- console.error('Integrity check failed.');
112
- console.error(`Mismatched hash for ${fileId}: ${localHash} vs ${bytesToHex(remoteHash)}`);
113
- process.exit(1);
114
- }
115
- }
116
- }
117
+ let fileHashesFromRegistry = await getFileHashesFromRegistry();
118
+
119
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
120
+ for (let [_packageId, fileHashes] of fileHashesFromRegistry) {
121
+ for (let [fileId, hash] of fileHashes) {
122
+ let remoteHash = new Uint8Array(hash);
123
+ let localHash = getLocalFileHash(fileId);
124
+
125
+ if (localHash !== bytesToHex(remoteHash)) {
126
+ console.error("Integrity check failed.");
127
+ console.error(
128
+ `Mismatched hash for ${fileId}: ${localHash} vs ${bytesToHex(remoteHash)}`,
129
+ );
130
+ process.exit(1);
131
+ }
132
+ }
133
+ }
117
134
  }
118
135
 
119
- export function readLockFile() : LockFile | null {
120
- let rootDir = getRootDir();
121
- let lockFile = path.join(rootDir, 'mops.lock');
122
- if (fs.existsSync(lockFile)) {
123
- return JSON.parse(fs.readFileSync(lockFile).toString()) as LockFile;
124
- }
125
- return null;
136
+ export function readLockFile(): LockFile | null {
137
+ let rootDir = getRootDir();
138
+ let lockFile = path.join(rootDir, "mops.lock");
139
+ if (fs.existsSync(lockFile)) {
140
+ return JSON.parse(fs.readFileSync(lockFile).toString()) as LockFile;
141
+ }
142
+ return null;
126
143
  }
127
144
 
128
145
  // check if lock file exists and integrity of mopsTomlDepsHash
129
- export function checkLockFileLight() : boolean {
130
- let existingLockFileJson = readLockFile();
131
- if (existingLockFileJson) {
132
- let mopsTomlDepsHash = getMopsTomlDepsHash();
133
- if (existingLockFileJson.version === 3 && mopsTomlDepsHash === existingLockFileJson.mopsTomlDepsHash) {
134
- return true;
135
- }
136
- }
137
- return false;
146
+ export function checkLockFileLight(): boolean {
147
+ let existingLockFileJson = readLockFile();
148
+ if (existingLockFileJson) {
149
+ let mopsTomlDepsHash = getMopsTomlDepsHash();
150
+ if (
151
+ existingLockFileJson.version === 3 &&
152
+ mopsTomlDepsHash === existingLockFileJson.mopsTomlDepsHash
153
+ ) {
154
+ return true;
155
+ }
156
+ }
157
+ return false;
138
158
  }
139
159
 
140
160
  export async function updateLockFile() {
141
- // if lock file exists and mops.toml hasn't changed, don't update it
142
- if (checkLockFileLight()) {
143
- return;
144
- }
145
-
146
- let resolvedDeps = await resolvePackages();
147
-
148
- let fileHashes = await getFileHashesFromRegistry();
149
-
150
- let lockFileJson : LockFileV3 = {
151
- version: 3,
152
- mopsTomlDepsHash: getMopsTomlDepsHash(),
153
- deps: resolvedDeps,
154
- hashes: fileHashes.reduce((acc, [packageId, fileHashes]) => {
155
- acc[packageId] = fileHashes.reduce((acc, [fileId, hash]) => {
156
- acc[fileId] = bytesToHex(new Uint8Array(hash));
157
- return acc;
158
- }, {} as Record<string, string>);
159
- return acc;
160
- }, {} as Record<string, Record<string, string>>),
161
- };
162
-
163
- let rootDir = getRootDir();
164
- let lockFile = path.join(rootDir, 'mops.lock');
165
- fs.writeFileSync(lockFile, JSON.stringify(lockFileJson, null, 2));
161
+ // if lock file exists and mops.toml hasn't changed, don't update it
162
+ if (checkLockFileLight()) {
163
+ return;
164
+ }
165
+
166
+ let resolvedDeps = await resolvePackages();
167
+
168
+ let fileHashes = await getFileHashesFromRegistry();
169
+
170
+ let lockFileJson: LockFileV3 = {
171
+ version: 3,
172
+ mopsTomlDepsHash: getMopsTomlDepsHash(),
173
+ deps: resolvedDeps,
174
+ hashes: fileHashes.reduce(
175
+ (acc, [packageId, fileHashes]) => {
176
+ acc[packageId] = fileHashes.reduce(
177
+ (acc, [fileId, hash]) => {
178
+ acc[fileId] = bytesToHex(new Uint8Array(hash));
179
+ return acc;
180
+ },
181
+ {} as Record<string, string>,
182
+ );
183
+ return acc;
184
+ },
185
+ {} as Record<string, Record<string, string>>,
186
+ ),
187
+ };
188
+
189
+ let rootDir = getRootDir();
190
+ let lockFile = path.join(rootDir, "mops.lock");
191
+ fs.writeFileSync(lockFile, JSON.stringify(lockFileJson, null, 2));
166
192
  }
167
193
 
168
194
  // compare hashes of local files with hashes from the lock file
169
195
  export async function checkLockFile(force = false) {
170
- let supportedVersions = [1, 2, 3];
171
- let rootDir = getRootDir();
172
- let lockFile = path.join(rootDir, 'mops.lock');
173
-
174
- // check if lock file exists
175
- if (!fs.existsSync(lockFile)) {
176
- if (force) {
177
- console.error('Missing lock file. Run `mops install` to generate it.');
178
- process.exit(1);
179
- }
180
- return;
181
- }
182
-
183
- let lockFileJsonGeneric : LockFileGeneric = JSON.parse(fs.readFileSync(lockFile).toString());
184
- let packageIds = await getResolvedMopsPackageIds();
185
-
186
- // check lock file version
187
- if (!supportedVersions.includes(lockFileJsonGeneric.version)) {
188
- console.error('Integrity check failed');
189
- console.error(`Invalid lock file version: ${lockFileJsonGeneric.version}. Supported versions: ${supportedVersions.join(', ')}`);
190
- process.exit(1);
191
- }
192
-
193
- let lockFileJson = lockFileJsonGeneric as LockFile;
194
-
195
- // V1: check mops.toml hash
196
- if (lockFileJson.version === 1) {
197
- if (lockFileJson.mopsTomlHash !== getMopsTomlHash()) {
198
- console.error('Integrity check failed');
199
- console.error('Mismatched mops.toml hash');
200
- console.error(`Locked hash: ${lockFileJson.mopsTomlHash}`);
201
- console.error(`Actual hash: ${getMopsTomlHash()}`);
202
- process.exit(1);
203
- }
204
- }
205
-
206
- // V2, V3: check mops.toml deps hash
207
- if (lockFileJson.version === 2 || lockFileJson.version === 3) {
208
- if (lockFileJson.mopsTomlDepsHash !== getMopsTomlDepsHash()) {
209
- console.error('Integrity check failed');
210
- console.error('Mismatched mops.toml dependencies hash');
211
- console.error(`Locked hash: ${lockFileJson.mopsTomlDepsHash}`);
212
- console.error(`Actual hash: ${getMopsTomlDepsHash()}`);
213
- process.exit(1);
214
- }
215
- }
216
-
217
- // V3: check locked deps (including GitHub and local packages)
218
- if (lockFileJson.version === 3) {
219
- let lockedDeps = {...lockFileJson.deps};
220
- let resolvedDeps = await resolvePackages();
221
-
222
- for (let name of Object.keys(resolvedDeps)) {
223
- if (lockedDeps[name] !== resolvedDeps[name]) {
224
- console.error('Integrity check failed');
225
- console.error(`Mismatched package ${name}`);
226
- console.error(`Locked: ${lockedDeps[name]}`);
227
- console.error(`Actual: ${resolvedDeps[name]}`);
228
- process.exit(1);
229
- }
230
- }
231
- }
232
-
233
- // check number of packages
234
- if (Object.keys(lockFileJson.hashes).length !== packageIds.length) {
235
- console.error('Integrity check failed');
236
- console.error(`Mismatched number of resolved packages: ${JSON.stringify(Object.keys(lockFileJson.hashes).length)} vs ${JSON.stringify(packageIds.length)}`);
237
- process.exit(1);
238
- }
239
-
240
- // check if resolved packages are in the lock file
241
- for (let packageId of packageIds) {
242
- if (!(packageId in lockFileJson.hashes)) {
243
- console.error('Integrity check failed');
244
- console.error(`Missing package ${packageId} in lock file`);
245
- process.exit(1);
246
- }
247
- }
248
-
249
- for (let [packageId, hashes] of Object.entries(lockFileJson.hashes)) {
250
-
251
- // check if package is in resolved packages
252
- if (!packageIds.includes(packageId)) {
253
- console.error('Integrity check failed');
254
- console.error(`Package ${packageId} in lock file but not in resolved packages`);
255
- process.exit(1);
256
- }
257
-
258
- for (let [fileId, lockedHash] of Object.entries(hashes)) {
259
-
260
- // check if file belongs to package
261
- if (!fileId.startsWith(packageId)) {
262
- console.error('Integrity check failed');
263
- console.error(`File ${fileId} in lock file does not belong to package ${packageId}`);
264
- process.exit(1);
265
- }
266
-
267
- // local file hash vs hash from lock file
268
- let localHash = getLocalFileHash(fileId);
269
- if (lockedHash !== localHash) {
270
- console.error('Integrity check failed');
271
- console.error(`Mismatched hash for ${fileId}`);
272
- console.error(`Locked hash: ${lockedHash}`);
273
- console.error(`Actual hash: ${localHash}`);
274
- process.exit(1);
275
- }
276
- }
277
- }
278
- }
196
+ let supportedVersions = [1, 2, 3];
197
+ let rootDir = getRootDir();
198
+ let lockFile = path.join(rootDir, "mops.lock");
199
+
200
+ // check if lock file exists
201
+ if (!fs.existsSync(lockFile)) {
202
+ if (force) {
203
+ console.error("Missing lock file. Run `mops install` to generate it.");
204
+ process.exit(1);
205
+ }
206
+ return;
207
+ }
208
+
209
+ let lockFileJsonGeneric: LockFileGeneric = JSON.parse(
210
+ fs.readFileSync(lockFile).toString(),
211
+ );
212
+ let packageIds = await getResolvedMopsPackageIds();
213
+
214
+ // check lock file version
215
+ if (!supportedVersions.includes(lockFileJsonGeneric.version)) {
216
+ console.error("Integrity check failed");
217
+ console.error(
218
+ `Invalid lock file version: ${lockFileJsonGeneric.version}. Supported versions: ${supportedVersions.join(", ")}`,
219
+ );
220
+ process.exit(1);
221
+ }
222
+
223
+ let lockFileJson = lockFileJsonGeneric as LockFile;
224
+
225
+ // V1: check mops.toml hash
226
+ if (lockFileJson.version === 1) {
227
+ if (lockFileJson.mopsTomlHash !== getMopsTomlHash()) {
228
+ console.error("Integrity check failed");
229
+ console.error("Mismatched mops.toml hash");
230
+ console.error(`Locked hash: ${lockFileJson.mopsTomlHash}`);
231
+ console.error(`Actual hash: ${getMopsTomlHash()}`);
232
+ process.exit(1);
233
+ }
234
+ }
235
+
236
+ // V2, V3: check mops.toml deps hash
237
+ if (lockFileJson.version === 2 || lockFileJson.version === 3) {
238
+ if (lockFileJson.mopsTomlDepsHash !== getMopsTomlDepsHash()) {
239
+ console.error("Integrity check failed");
240
+ console.error("Mismatched mops.toml dependencies hash");
241
+ console.error(`Locked hash: ${lockFileJson.mopsTomlDepsHash}`);
242
+ console.error(`Actual hash: ${getMopsTomlDepsHash()}`);
243
+ process.exit(1);
244
+ }
245
+ }
246
+
247
+ // V3: check locked deps (including GitHub and local packages)
248
+ if (lockFileJson.version === 3) {
249
+ let lockedDeps = { ...lockFileJson.deps };
250
+ let resolvedDeps = await resolvePackages();
251
+
252
+ for (let name of Object.keys(resolvedDeps)) {
253
+ if (lockedDeps[name] !== resolvedDeps[name]) {
254
+ console.error("Integrity check failed");
255
+ console.error(`Mismatched package ${name}`);
256
+ console.error(`Locked: ${lockedDeps[name]}`);
257
+ console.error(`Actual: ${resolvedDeps[name]}`);
258
+ process.exit(1);
259
+ }
260
+ }
261
+ }
262
+
263
+ // check number of packages
264
+ if (Object.keys(lockFileJson.hashes).length !== packageIds.length) {
265
+ console.error("Integrity check failed");
266
+ console.error(
267
+ `Mismatched number of resolved packages: ${JSON.stringify(Object.keys(lockFileJson.hashes).length)} vs ${JSON.stringify(packageIds.length)}`,
268
+ );
269
+ process.exit(1);
270
+ }
271
+
272
+ // check if resolved packages are in the lock file
273
+ for (let packageId of packageIds) {
274
+ if (!(packageId in lockFileJson.hashes)) {
275
+ console.error("Integrity check failed");
276
+ console.error(`Missing package ${packageId} in lock file`);
277
+ process.exit(1);
278
+ }
279
+ }
280
+
281
+ for (let [packageId, hashes] of Object.entries(lockFileJson.hashes)) {
282
+ // check if package is in resolved packages
283
+ if (!packageIds.includes(packageId)) {
284
+ console.error("Integrity check failed");
285
+ console.error(
286
+ `Package ${packageId} in lock file but not in resolved packages`,
287
+ );
288
+ process.exit(1);
289
+ }
290
+
291
+ for (let [fileId, lockedHash] of Object.entries(hashes)) {
292
+ // check if file belongs to package
293
+ if (!fileId.startsWith(packageId)) {
294
+ console.error("Integrity check failed");
295
+ console.error(
296
+ `File ${fileId} in lock file does not belong to package ${packageId}`,
297
+ );
298
+ process.exit(1);
299
+ }
300
+
301
+ // local file hash vs hash from lock file
302
+ let localHash = getLocalFileHash(fileId);
303
+ if (lockedHash !== localHash) {
304
+ console.error("Integrity check failed");
305
+ console.error(`Mismatched hash for ${fileId}`);
306
+ console.error(`Locked hash: ${lockedHash}`);
307
+ console.error(`Actual hash: ${localHash}`);
308
+ process.exit(1);
309
+ }
310
+ }
311
+ }
312
+ }
package/jest.config.js ADDED
@@ -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
+ };