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
package/types.ts CHANGED
@@ -1,46 +1,56 @@
1
1
  export type Config = {
2
- package ?: {
3
- name : string;
4
- version : string;
5
- description ?: string;
6
- license ?: string;
7
- repository ?: string;
8
- keywords ?: string[];
9
- baseDir ?: string;
10
- readme ?: string;
11
- files ?: string[];
12
- homepage ?: string;
13
- documentation ?: string;
14
- dfx ?: string;
15
- moc ?: string;
16
- donation ?: string;
17
- };
18
- dependencies ?: Dependencies;
19
- 'dev-dependencies' ?: Dependencies;
20
- toolchain ?: Toolchain;
21
- requirements ?: Requirements;
22
- // format ?: Format;
2
+ package?: {
3
+ name: string;
4
+ version: string;
5
+ description?: string;
6
+ license?: string;
7
+ repository?: string;
8
+ keywords?: string[];
9
+ baseDir?: string;
10
+ readme?: string;
11
+ files?: string[];
12
+ homepage?: string;
13
+ documentation?: string;
14
+ dfx?: string;
15
+ moc?: string;
16
+ donation?: string;
17
+ };
18
+ dependencies?: Dependencies;
19
+ "dev-dependencies"?: Dependencies;
20
+ toolchain?: Toolchain;
21
+ requirements?: Requirements;
22
+ canisters?: Record<string, string | CanisterConfig>;
23
+ build?: {
24
+ outputDir?: string;
25
+ args?: string[];
26
+ };
27
+ };
28
+
29
+ export type CanisterConfig = {
30
+ main: string;
31
+ args?: string[];
32
+ candid?: string;
23
33
  };
24
34
 
25
35
  export type Dependencies = Record<string, Dependency>;
26
36
 
27
37
  export type Dependency = {
28
- name : string;
29
- version ?: string; // mops package
30
- repo ?: string; // github package
31
- path ?: string; // local package
38
+ name: string;
39
+ version?: string; // mops package
40
+ repo?: string; // github package
41
+ path?: string; // local package
32
42
  };
33
43
 
34
44
  export type Toolchain = {
35
- moc ?: string;
36
- wasmtime ?: string;
37
- 'pocket-ic' ?: string;
45
+ moc?: string;
46
+ wasmtime?: string;
47
+ "pocket-ic"?: string;
38
48
  };
39
49
 
40
- export type Tool = 'moc' | 'wasmtime' | 'pocket-ic';
50
+ export type Tool = "moc" | "wasmtime" | "pocket-ic";
41
51
 
42
52
  export type Requirements = {
43
- moc ?: string;
53
+ moc?: string;
44
54
  };
45
55
 
46
56
  // export type Format = {
@@ -52,4 +62,4 @@ export type Requirements = {
52
62
  // trailingComma ?: 'none' | 'all';
53
63
  // };
54
64
 
55
- export type TestMode = 'interpreter' | 'wasi' | 'replica';
65
+ export type TestMode = "interpreter" | "wasi" | "replica";
package/vessel.ts CHANGED
@@ -1,199 +1,231 @@
1
- import process from 'node:process';
2
- import {existsSync, mkdirSync, createWriteStream, readFileSync, writeFileSync} from 'node:fs';
3
- import path from 'node:path';
4
- import {pipeline} from 'node:stream';
5
- import {deleteSync} from 'del';
6
- import {execaCommand} from 'execa';
7
- import chalk from 'chalk';
8
- import {createLogUpdate} from 'log-update';
9
- import got from 'got';
10
- import decompress from 'decompress';
11
- import {parseGithubURL, progressBar} from './mops.js';
12
- import {getDepCacheDir, getGithubDepCacheName, isDepCached} from './cache.js';
13
-
14
- const dhallFileToJson = async (filePath : string, silent : boolean) => {
15
- if (existsSync(filePath)) {
16
- let cwd = new URL(path.dirname(import.meta.url)).pathname;
17
- let res;
18
- try {
19
- res = await execaCommand(`dhall-to-json --file ${filePath}`, {preferLocal:true, cwd});
20
- }
21
- catch (err : any) {
22
- silent || console.error('dhall-to-json error:', err.message?.split('Message:')[0]);
23
- return null;
24
- }
25
-
26
- if (res.exitCode === 0) {
27
- return JSON.parse(res.stdout);
28
- }
29
- else {
30
- return res;
31
- }
32
- }
33
-
34
- return null;
1
+ import process from "node:process";
2
+ import {
3
+ existsSync,
4
+ mkdirSync,
5
+ createWriteStream,
6
+ readFileSync,
7
+ writeFileSync,
8
+ } from "node:fs";
9
+ import path from "node:path";
10
+ import { pipeline } from "node:stream";
11
+ import { deleteSync } from "del";
12
+ import { execaCommand } from "execa";
13
+ import chalk from "chalk";
14
+ import { createLogUpdate } from "log-update";
15
+ import got from "got";
16
+ import decompress from "decompress";
17
+ import { parseGithubURL, progressBar } from "./mops.js";
18
+ import { getDepCacheDir, getGithubDepCacheName, isDepCached } from "./cache.js";
19
+
20
+ const dhallFileToJson = async (filePath: string, silent: boolean) => {
21
+ if (existsSync(filePath)) {
22
+ let cwd = new URL(path.dirname(import.meta.url)).pathname;
23
+ let res;
24
+ try {
25
+ res = await execaCommand(`dhall-to-json --file ${filePath}`, {
26
+ preferLocal: true,
27
+ cwd,
28
+ });
29
+ } catch (err: any) {
30
+ silent ||
31
+ console.error(
32
+ "dhall-to-json error:",
33
+ err.message?.split("Message:")[0],
34
+ );
35
+ return null;
36
+ }
37
+
38
+ if (res.exitCode === 0) {
39
+ return JSON.parse(res.stdout);
40
+ } else {
41
+ return res;
42
+ }
43
+ }
44
+
45
+ return null;
35
46
  };
36
47
 
37
48
  export type VesselConfig = {
38
- dependencies : VesselDependencies;
39
- 'dev-dependencies' : VesselDependencies;
49
+ dependencies: VesselDependencies;
50
+ "dev-dependencies": VesselDependencies;
40
51
  };
41
52
 
42
53
  export type VesselDependencies = Array<{
43
- name : string;
44
- version ?: string; // mops package
45
- repo ?: string; // github package
46
- path ?: string; // local package
54
+ name: string;
55
+ version?: string; // mops package
56
+ repo?: string; // github package
57
+ path?: string; // local package
47
58
  }>;
48
59
 
49
- export const readVesselConfig = async (dir : string, {cache = true, silent = false} = {}) : Promise<VesselConfig | null> => {
50
- const cachedFile = (dir || process.cwd()) + '/vessel.json';
51
-
52
- if (existsSync(cachedFile)) {
53
- let cachedConfig = readFileSync(cachedFile).toString();
54
- return JSON.parse(cachedConfig);
55
- }
56
-
57
- const [vessel, packageSetArray] = await Promise.all([
58
- dhallFileToJson((dir || process.cwd()) + '/vessel.dhall', silent),
59
- dhallFileToJson((dir || process.cwd()) + '/package-set.dhall', silent),
60
- ]);
61
-
62
- if (!vessel || !packageSetArray) {
63
- return null;
64
- }
65
-
66
- let repos : Record<string, string> = {};
67
- for (const {name, repo, version} of packageSetArray) {
68
- const {org, gitName} = parseGithubURL(repo);
69
- repos[name] = `https://github.com/${org}/${gitName}#${version}`;
70
- }
71
-
72
- let config : VesselConfig = {
73
- dependencies: vessel.dependencies.map((name : string) => {
74
- return {name, repo: repos[name], version: ''};
75
- }),
76
- 'dev-dependencies': [],
77
- };
78
-
79
- if (cache === true) {
80
- writeFileSync(cachedFile, JSON.stringify(config), 'utf-8');
81
- }
82
-
83
- return config;
60
+ export const readVesselConfig = async (
61
+ dir: string,
62
+ { cache = true, silent = false } = {},
63
+ ): Promise<VesselConfig | null> => {
64
+ const cachedFile = (dir || process.cwd()) + "/vessel.json";
65
+
66
+ if (existsSync(cachedFile)) {
67
+ let cachedConfig = readFileSync(cachedFile).toString();
68
+ return JSON.parse(cachedConfig);
69
+ }
70
+
71
+ const [vessel, packageSetArray] = await Promise.all([
72
+ dhallFileToJson((dir || process.cwd()) + "/vessel.dhall", silent),
73
+ dhallFileToJson((dir || process.cwd()) + "/package-set.dhall", silent),
74
+ ]);
75
+
76
+ if (!vessel || !packageSetArray) {
77
+ return null;
78
+ }
79
+
80
+ let repos: Record<string, string> = {};
81
+ for (const { name, repo, version } of packageSetArray) {
82
+ const { org, gitName } = parseGithubURL(repo);
83
+ repos[name] = `https://github.com/${org}/${gitName}#${version}`;
84
+ }
85
+
86
+ let config: VesselConfig = {
87
+ dependencies: vessel.dependencies.map((name: string) => {
88
+ return { name, repo: repos[name], version: "" };
89
+ }),
90
+ "dev-dependencies": [],
91
+ };
92
+
93
+ if (cache === true) {
94
+ writeFileSync(cachedFile, JSON.stringify(config), "utf-8");
95
+ }
96
+
97
+ return config;
84
98
  };
85
99
 
86
- export const downloadFromGithub = async (repo : string, dest : string, onProgress : any) => {
87
- const {branch, org, gitName, commitHash} = parseGithubURL(repo);
88
-
89
- const zipFile = `https://github.com/${org}/${gitName}/archive/${commitHash || branch}.zip`;
90
- const readStream = got.stream(zipFile);
91
-
92
- const promise = new Promise((resolve, reject) => {
93
- readStream.on('error', (err) => {
94
- console.error(chalk.red(`Error: failed to download from GitHub: ${zipFile}`));
95
- console.error(err.message);
96
- reject(err);
97
- });
98
-
99
- readStream.on('downloadProgress', ({transferred, total}) => {
100
- onProgress?.(transferred, total || 2 * (1024 ** 2));
101
- });
102
-
103
- readStream.on('response', (response) => {
104
- if (response.headers.age > 3600) {
105
- console.error(chalk.red('Error: ') + 'Failure - response too old');
106
- readStream.destroy(); // Destroy the stream to prevent hanging resources.
107
- reject();
108
- return;
109
- }
110
-
111
- // Prevent `onError` being called twice.
112
- readStream.off('error', reject);
113
- const tmpDir = path.resolve(process.cwd(), '.mops/_tmp/');
114
- const tmpFile = path.resolve(tmpDir, `${gitName}@${(commitHash || branch).replaceAll('/', '___')}.zip`);
115
-
116
- try {
117
- mkdirSync(tmpDir, {recursive: true});
118
-
119
- pipeline(readStream, createWriteStream(tmpFile), (err) => {
120
- if (err) {
121
- deleteSync([tmpDir]);
122
- reject(err);
123
- }
124
- else {
125
- let options = {
126
- extract: true,
127
- strip: 1,
128
- headers: {
129
- accept: 'application/zip',
130
- },
131
- };
132
- decompress(tmpFile, dest, options).then((unzippedFiles) => {
133
- deleteSync([tmpDir]);
134
- resolve(unzippedFiles);
135
- }).catch(err => {
136
- deleteSync([tmpDir]);
137
- reject(err);
138
- });
139
- }
140
- });
141
- }
142
- catch (err) {
143
- deleteSync([tmpDir]);
144
- reject(err);
145
- }
146
- });
147
- });
148
-
149
- return promise;
100
+ export const downloadFromGithub = async (
101
+ repo: string,
102
+ dest: string,
103
+ onProgress: any,
104
+ ) => {
105
+ const { branch, org, gitName, commitHash } = parseGithubURL(repo);
106
+
107
+ const zipFile = `https://github.com/${org}/${gitName}/archive/${commitHash || branch}.zip`;
108
+ const readStream = got.stream(zipFile);
109
+
110
+ const promise = new Promise((resolve, reject) => {
111
+ readStream.on("error", (err) => {
112
+ console.error(
113
+ chalk.red(`Error: failed to download from GitHub: ${zipFile}`),
114
+ );
115
+ console.error(err.message);
116
+ reject(err);
117
+ });
118
+
119
+ readStream.on("downloadProgress", ({ transferred, total }) => {
120
+ onProgress?.(transferred, total || 2 * 1024 ** 2);
121
+ });
122
+
123
+ readStream.on("response", (response) => {
124
+ if (response.headers.age > 3600) {
125
+ console.error(chalk.red("Error: ") + "Failure - response too old");
126
+ readStream.destroy(); // Destroy the stream to prevent hanging resources.
127
+ reject();
128
+ return;
129
+ }
130
+
131
+ // Prevent `onError` being called twice.
132
+ readStream.off("error", reject);
133
+ const tmpDir = path.resolve(process.cwd(), ".mops/_tmp/");
134
+ const tmpFile = path.resolve(
135
+ tmpDir,
136
+ `${gitName}@${(commitHash || branch).replaceAll("/", "___")}.zip`,
137
+ );
138
+
139
+ try {
140
+ mkdirSync(tmpDir, { recursive: true });
141
+
142
+ pipeline(readStream, createWriteStream(tmpFile), (err) => {
143
+ if (err) {
144
+ deleteSync([tmpDir]);
145
+ reject(err);
146
+ } else {
147
+ let options = {
148
+ extract: true,
149
+ strip: 1,
150
+ headers: {
151
+ accept: "application/zip",
152
+ },
153
+ };
154
+ decompress(tmpFile, dest, options)
155
+ .then((unzippedFiles) => {
156
+ deleteSync([tmpDir]);
157
+ resolve(unzippedFiles);
158
+ })
159
+ .catch((err) => {
160
+ deleteSync([tmpDir]);
161
+ reject(err);
162
+ });
163
+ }
164
+ });
165
+ } catch (err) {
166
+ deleteSync([tmpDir]);
167
+ reject(err);
168
+ }
169
+ });
170
+ });
171
+
172
+ return promise;
150
173
  };
151
174
 
152
- export const installFromGithub = async (name : string, repo : string, {verbose = false, dep = false, silent = false, ignoreTransitive = false} = {}) => {
153
- let cacheName = getGithubDepCacheName(name, repo);
154
- let cacheDir = getDepCacheDir(cacheName);
155
-
156
- let logUpdate = createLogUpdate(process.stdout, {showCursor: true});
157
-
158
- if (isDepCached(cacheName)) {
159
- silent || logUpdate(`${dep ? 'Dependency' : 'Installing'} ${repo} (cache)`);
160
- }
161
- else {
162
- let progress = (step : number, total : number) => {
163
- silent || logUpdate(`${dep ? 'Dependency' : 'Installing'} ${repo} ${progressBar(step, total)}`);
164
- };
165
-
166
- progress(0, 1024 * 500);
167
-
168
- mkdirSync(cacheDir, {recursive: true});
169
-
170
- try {
171
- await downloadFromGithub(repo, cacheDir, progress);
172
- }
173
- catch (err) {
174
- deleteSync([cacheDir], {force: true});
175
- process.exit(1);
176
- }
177
- }
178
-
179
- if (verbose) {
180
- silent || logUpdate.done();
181
- }
182
- else {
183
- logUpdate.clear();
184
- }
185
-
186
- if (ignoreTransitive) {
187
- return;
188
- }
189
-
190
- const config = await readVesselConfig(cacheDir, {silent});
191
-
192
- if (config) {
193
- for (const {name, repo} of config.dependencies) {
194
- if (repo) {
195
- await installFromGithub(name, repo, {verbose, silent, dep: true});
196
- }
197
- }
198
- }
199
- };
175
+ export const installFromGithub = async (
176
+ name: string,
177
+ repo: string,
178
+ {
179
+ verbose = false,
180
+ dep = false,
181
+ silent = false,
182
+ ignoreTransitive = false,
183
+ } = {},
184
+ ) => {
185
+ let cacheName = getGithubDepCacheName(name, repo);
186
+ let cacheDir = getDepCacheDir(cacheName);
187
+
188
+ let logUpdate = createLogUpdate(process.stdout, { showCursor: true });
189
+
190
+ if (isDepCached(cacheName)) {
191
+ silent || logUpdate(`${dep ? "Dependency" : "Installing"} ${repo} (cache)`);
192
+ } else {
193
+ let progress = (step: number, total: number) => {
194
+ silent ||
195
+ logUpdate(
196
+ `${dep ? "Dependency" : "Installing"} ${repo} ${progressBar(step, total)}`,
197
+ );
198
+ };
199
+
200
+ progress(0, 1024 * 500);
201
+
202
+ mkdirSync(cacheDir, { recursive: true });
203
+
204
+ try {
205
+ await downloadFromGithub(repo, cacheDir, progress);
206
+ } catch (err) {
207
+ deleteSync([cacheDir], { force: true });
208
+ process.exit(1);
209
+ }
210
+ }
211
+
212
+ if (verbose) {
213
+ silent || logUpdate.done();
214
+ } else {
215
+ logUpdate.clear();
216
+ }
217
+
218
+ if (ignoreTransitive) {
219
+ return;
220
+ }
221
+
222
+ const config = await readVesselConfig(cacheDir, { silent });
223
+
224
+ if (config) {
225
+ for (const { name, repo } of config.dependencies) {
226
+ if (repo) {
227
+ await installFromGithub(name, repo, { verbose, silent, dep: true });
228
+ }
229
+ }
230
+ }
231
+ };