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/mops.ts CHANGED
@@ -1,279 +1,302 @@
1
- import process from 'node:process';
2
- import path from 'node:path';
3
- import fs from 'node:fs';
4
- import {Identity} from '@icp-sdk/core/agent';
5
- import TOML from '@iarna/toml';
6
- import chalk from 'chalk';
7
- import prompts from 'prompts';
8
- import fetch from 'node-fetch';
9
-
10
- import {decodeFile} from './pem.js';
11
- import {Config, Dependency} from './types.js';
12
- import {mainActor, storageActor} from './api/actors.js';
13
- import {getNetwork} from './api/network.js';
14
- import {getHighestVersion} from './api/getHighestVersion.js';
15
- import {getPackageId} from './helpers/get-package-id.js';
16
-
1
+ import process from "node:process";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ import { Identity } from "@icp-sdk/core/agent";
5
+ import TOML from "@iarna/toml";
6
+ import chalk from "chalk";
7
+ import prompts from "prompts";
8
+ import fetch from "node-fetch";
9
+
10
+ import { decodeFile } from "./pem.js";
11
+ import { Config, Dependency } from "./types.js";
12
+ import { mainActor, storageActor } from "./api/actors.js";
13
+ import { getNetwork } from "./api/network.js";
14
+ import { getHighestVersion } from "./api/getHighestVersion.js";
15
+ import { getPackageId } from "./helpers/get-package-id.js";
17
16
 
18
17
  if (!globalThis.fetch) {
19
- globalThis.fetch = fetch as any;
18
+ globalThis.fetch = fetch as any;
20
19
  }
21
20
 
22
21
  // (!) make changes in pair with backend
23
- export let apiVersion = '1.3';
22
+ export let apiVersion = "1.3";
24
23
 
25
- export let globalConfigDir = '';
26
- export let globalCacheDir = '';
24
+ export let globalConfigDir = "";
25
+ export let globalCacheDir = "";
27
26
 
28
27
  // OS specific dirs
29
- if (process.platform == 'win32') {
30
- globalConfigDir = path.join(process.env.LOCALAPPDATA || '', 'mops/config');
31
- globalCacheDir = path.join(process.env.LOCALAPPDATA || '', 'mops/cache');
32
- }
33
- else if (process.platform == 'darwin') {
34
- globalConfigDir = path.join(process.env.HOME || '', 'Library/Application Support/mops');
35
- globalCacheDir = path.join(process.env.HOME || '', 'Library/Caches/mops');
36
- }
37
- else {
38
- globalConfigDir = path.join(process.env.HOME || '', '.config/mops');
39
- globalCacheDir = path.join(process.env.HOME || '', '.cache/mops');
28
+ if (process.platform == "win32") {
29
+ globalConfigDir = path.join(process.env.LOCALAPPDATA || "", "mops/config");
30
+ globalCacheDir = path.join(process.env.LOCALAPPDATA || "", "mops/cache");
31
+ } else if (process.platform == "darwin") {
32
+ globalConfigDir = path.join(
33
+ process.env.HOME || "",
34
+ "Library/Application Support/mops",
35
+ );
36
+ globalCacheDir = path.join(process.env.HOME || "", "Library/Caches/mops");
37
+ } else {
38
+ globalConfigDir = path.join(process.env.HOME || "", ".config/mops");
39
+ globalCacheDir = path.join(process.env.HOME || "", ".cache/mops");
40
40
  }
41
41
  // XDG overrides
42
42
  if (process.env.XDG_CONFIG_HOME) {
43
- globalConfigDir = path.join(process.env.XDG_CONFIG_HOME, 'mops');
43
+ globalConfigDir = path.join(process.env.XDG_CONFIG_HOME, "mops");
44
44
  }
45
45
  if (process.env.XDG_CACHE_HOME) {
46
- globalCacheDir = path.join(process.env.XDG_CACHE_HOME, 'mops');
46
+ globalCacheDir = path.join(process.env.XDG_CACHE_HOME, "mops");
47
47
  }
48
48
 
49
- export function getNetworkFile() : string | URL {
50
- let networkFile : string | URL = '';
51
- try {
52
- networkFile = new URL('./network.txt', import.meta.url);
53
- }
54
- catch {
55
- networkFile = path.join(__dirname, 'network.txt');
56
- }
57
- return networkFile;
49
+ export function getNetworkFile(): string | URL {
50
+ let networkFile: string | URL = "";
51
+ try {
52
+ networkFile = new URL("./network.txt", import.meta.url);
53
+ } catch {
54
+ networkFile = path.join(__dirname, "network.txt");
55
+ }
56
+ return networkFile;
58
57
  }
59
58
 
60
- export function setNetwork(network : string) {
61
- fs.writeFileSync(getNetworkFile(), network);
59
+ export function setNetwork(network: string) {
60
+ fs.writeFileSync(getNetworkFile(), network);
62
61
  }
63
62
 
64
- export let getIdentity = async () : Promise<Identity | undefined> => {
65
- let identityPem = path.resolve(globalConfigDir, 'identity.pem');
66
- let identityPemEncrypted = path.resolve(globalConfigDir, 'identity.pem.encrypted');
67
- if (fs.existsSync(identityPemEncrypted)) {
68
- let res = await prompts({
69
- type: 'invisible',
70
- name: 'value',
71
- message: 'Enter password:',
72
- });
73
- try {
74
- return decodeFile(identityPemEncrypted, res.value);
75
- }
76
- catch (e) {
77
- console.log(chalk.red('Error: ') + 'Invalid password');
78
- process.exit(1);
79
- }
80
- }
81
- if (fs.existsSync(identityPem)) {
82
- return decodeFile(identityPem);
83
- }
84
- return undefined;
63
+ export let getIdentity = async (): Promise<Identity | undefined> => {
64
+ let identityPem = path.resolve(globalConfigDir, "identity.pem");
65
+ let identityPemEncrypted = path.resolve(
66
+ globalConfigDir,
67
+ "identity.pem.encrypted",
68
+ );
69
+ if (fs.existsSync(identityPemEncrypted)) {
70
+ let res = await prompts({
71
+ type: "invisible",
72
+ name: "value",
73
+ message: "Enter password:",
74
+ });
75
+ try {
76
+ return decodeFile(identityPemEncrypted, res.value);
77
+ } catch (e) {
78
+ console.log(chalk.red("Error: ") + "Invalid password");
79
+ process.exit(1);
80
+ }
81
+ }
82
+ if (fs.existsSync(identityPem)) {
83
+ return decodeFile(identityPem);
84
+ }
85
+ return undefined;
85
86
  };
86
87
 
87
- export function getClosestConfigFile(dir = process.cwd()) : string {
88
- if (!path.basename(dir)) {
89
- return '';
90
- }
91
- let configFile = path.join(dir, 'mops.toml');
92
- if (fs.existsSync(configFile)) {
93
- return configFile;
94
- }
95
- return getClosestConfigFile(path.resolve(dir, '..'));
88
+ export function getClosestConfigFile(dir = process.cwd()): string {
89
+ if (!path.basename(dir)) {
90
+ return "";
91
+ }
92
+ let configFile = path.join(dir, "mops.toml");
93
+ if (fs.existsSync(configFile)) {
94
+ return configFile;
95
+ }
96
+ return getClosestConfigFile(path.resolve(dir, ".."));
96
97
  }
97
98
 
98
99
  export function getRootDir() {
99
- let configFile = getClosestConfigFile();
100
- if (!configFile) {
101
- return '';
102
- }
103
- return path.dirname(configFile);
100
+ let configFile = getClosestConfigFile();
101
+ if (!configFile) {
102
+ return "";
103
+ }
104
+ return path.dirname(configFile);
104
105
  }
105
106
 
106
107
  export function checkConfigFile(exit = false) {
107
- let configFile = getClosestConfigFile();
108
- if (!configFile) {
109
- console.log(chalk.red('Error: ') + `Config file 'mops.toml' not found. Please run ${chalk.green('mops init')} first`);
110
- if (exit) {
111
- process.exit(1);
112
- }
113
- return false;
114
- }
115
- return true;
108
+ let configFile = getClosestConfigFile();
109
+ if (!configFile) {
110
+ console.log(
111
+ chalk.red("Error: ") +
112
+ `Config file 'mops.toml' not found. Please run ${chalk.green("mops init")} first`,
113
+ );
114
+ if (exit) {
115
+ process.exit(1);
116
+ }
117
+ return false;
118
+ }
119
+ return true;
116
120
  }
117
121
 
118
- export function progressBar(step : number, total : number) {
119
- let done = Math.round(step / total * 10);
120
- return `[${':'.repeat(done)}${' '.repeat(Math.max(0, 10 - done))}]`;
122
+ export function progressBar(step: number, total: number) {
123
+ let done = Math.round((step / total) * 10);
124
+ return `[${":".repeat(done)}${" ".repeat(Math.max(0, 10 - done))}]`;
121
125
  }
122
126
 
123
- export function parseGithubURL(href : string) {
124
- const url = new URL(href);
125
- let branchAndSha = url.hash?.substring(1).split('@');
126
- let branch = branchAndSha[0] || 'master';
127
- let commitHash = branchAndSha[1] || '';
128
- let [org, gitName] = url.pathname.split('/').filter(path => !!path);
129
- org = org || '';
130
- gitName = gitName || '';
131
-
132
- if (gitName?.endsWith('.git')) {
133
- gitName = gitName.substring(0, gitName.length - 4);
134
- }
135
- return {org, gitName, branch, commitHash};
127
+ export function parseGithubURL(href: string) {
128
+ const url = new URL(href);
129
+ let branchAndSha = url.hash?.substring(1).split("@");
130
+ let branch = branchAndSha[0] || "master";
131
+ let commitHash = branchAndSha[1] || "";
132
+ let [org, gitName] = url.pathname.split("/").filter((path) => !!path);
133
+ org = org || "";
134
+ gitName = gitName || "";
135
+
136
+ if (gitName?.endsWith(".git")) {
137
+ gitName = gitName.substring(0, gitName.length - 4);
138
+ }
139
+ return { org, gitName, branch, commitHash };
136
140
  }
137
141
 
138
- export async function getGithubCommit(repo : string, ref : string) : Promise<any> {
139
- let res = await fetch(`https://api.github.com/repos/${repo}/commits/${ref}`);
140
- let json : any = await res.json();
142
+ export async function getGithubCommit(repo: string, ref: string): Promise<any> {
143
+ let res = await fetch(`https://api.github.com/repos/${repo}/commits/${ref}`);
144
+ let json: any = await res.json();
141
145
 
142
- // try on main branch
143
- if (json.message && ref === 'master') {
144
- res = await fetch(`https://api.github.com/repos/${repo}/commits/main`);
145
- json = await res.json();
146
- }
147
- return json;
146
+ // try on main branch
147
+ if (json.message && ref === "master") {
148
+ res = await fetch(`https://api.github.com/repos/${repo}/commits/main`);
149
+ json = await res.json();
150
+ }
151
+ return json;
148
152
  }
149
153
 
150
- export function getDependencyType(version : string) {
151
- if (!version || typeof version !== 'string') {
152
- throw Error(`Invalid dependency value "${version}"`);
153
- }
154
- if (version.startsWith('https://github.com/')) {
155
- return 'github';
156
- }
157
- else if (version.match(/^(\.?\.)?\//)) {
158
- return 'local';
159
- }
160
- else {
161
- return 'mops';
162
- }
154
+ export function getDependencyType(version: string) {
155
+ if (!version || typeof version !== "string") {
156
+ throw Error(`Invalid dependency value "${version}"`);
157
+ }
158
+ if (version.startsWith("https://github.com/")) {
159
+ return "github";
160
+ } else if (version.match(/^(\.?\.)?\//)) {
161
+ return "local";
162
+ } else {
163
+ return "mops";
164
+ }
163
165
  }
164
166
 
165
- export function parseDepValue(name : string, value : string) : Dependency {
166
- let depType = getDependencyType(value);
167
- if (depType === 'github') {
168
- return {name, repo: value, version: ''};
169
- }
170
- else if (depType === 'local') {
171
- return {name, repo: '', path: value, version: ''};
172
- }
173
- else {
174
- return {name, repo: '', version: value};
175
- }
167
+ export function parseDepValue(name: string, value: string): Dependency {
168
+ let depType = getDependencyType(value);
169
+ if (depType === "github") {
170
+ return { name, repo: value, version: "" };
171
+ } else if (depType === "local") {
172
+ return { name, repo: "", path: value, version: "" };
173
+ } else {
174
+ return { name, repo: "", version: value };
175
+ }
176
176
  }
177
177
 
178
- export function readConfig(configFile = getClosestConfigFile()) : Config {
179
- let text = fs.readFileSync(configFile).toString();
180
- let toml = TOML.parse(text);
178
+ export function readConfig(configFile = getClosestConfigFile()): Config {
179
+ let text = fs.readFileSync(configFile).toString();
180
+ let toml = TOML.parse(text);
181
181
 
182
- let processDeps = (deps : any) => {
183
- Object.entries(deps).forEach(([name, data]) => {
184
- if (!data || typeof data !== 'string') {
185
- throw Error(`Invalid dependency value ${name} = "${data}"`);
186
- }
187
- deps[name] = parseDepValue(name, data);
188
- });
189
- };
182
+ let processDeps = (deps: any) => {
183
+ Object.entries(deps).forEach(([name, data]) => {
184
+ if (!data || typeof data !== "string") {
185
+ throw Error(`Invalid dependency value ${name} = "${data}"`);
186
+ }
187
+ deps[name] = parseDepValue(name, data);
188
+ });
189
+ };
190
190
 
191
- processDeps(toml.dependencies || {});
192
- processDeps(toml['dev-dependencies'] || {});
191
+ processDeps(toml.dependencies || {});
192
+ processDeps(toml["dev-dependencies"] || {});
193
193
 
194
- let config : Config = {...toml};
194
+ let config: Config = { ...toml };
195
195
 
196
- Object.entries(config.requirements || {}).forEach(([name, value]) => {
197
- if (name === 'moc') {
198
- config.requirements = config.requirements || {};
199
- config.requirements.moc = value;
200
- }
201
- });
196
+ Object.entries(config.requirements || {}).forEach(([name, value]) => {
197
+ if (name === "moc") {
198
+ config.requirements = config.requirements || {};
199
+ config.requirements.moc = value;
200
+ }
201
+ });
202
202
 
203
- return config;
203
+ return config;
204
204
  }
205
205
 
206
- export function writeConfig(config : Config, configFile = getClosestConfigFile()) {
207
- let resConfig : any = JSON.parse(JSON.stringify(config));
208
-
209
- let deps = resConfig.dependencies || {};
210
- Object.entries(config.dependencies || {}).forEach(([name, {repo, path, version}]) => {
211
- deps[name] = repo || path || version;
212
- });
213
-
214
- let devDeps = resConfig['dev-dependencies'] || {};
215
- Object.entries(config['dev-dependencies'] || {}).forEach(([name, {repo, path, version}]) => {
216
- devDeps[name] = repo || path || version;
217
- });
218
-
219
- let text = TOML.stringify(resConfig).trim();
220
- if (fs.existsSync(configFile) && fs.readFileSync(configFile).toString().endsWith('\n')) {
221
- text += '\n';
222
- }
223
- fs.writeFileSync(configFile, text);
206
+ export function writeConfig(
207
+ config: Config,
208
+ configFile = getClosestConfigFile(),
209
+ ) {
210
+ let resConfig: any = JSON.parse(JSON.stringify(config));
211
+
212
+ let deps = resConfig.dependencies || {};
213
+ Object.entries(config.dependencies || {}).forEach(
214
+ ([name, { repo, path, version }]) => {
215
+ deps[name] = repo || path || version;
216
+ },
217
+ );
218
+
219
+ let devDeps = resConfig["dev-dependencies"] || {};
220
+ Object.entries(config["dev-dependencies"] || {}).forEach(
221
+ ([name, { repo, path, version }]) => {
222
+ devDeps[name] = repo || path || version;
223
+ },
224
+ );
225
+
226
+ let text = TOML.stringify(resConfig).trim();
227
+ if (
228
+ fs.existsSync(configFile) &&
229
+ fs.readFileSync(configFile).toString().endsWith("\n")
230
+ ) {
231
+ text += "\n";
232
+ }
233
+ fs.writeFileSync(configFile, text);
224
234
  }
225
235
 
226
- export function formatDir(name : string, version : string) {
227
- return path.join(getRootDir(), '.mops', getPackageId(name, version));
236
+ export function formatDir(name: string, version: string) {
237
+ return path.join(getRootDir(), ".mops", getPackageId(name, version));
228
238
  }
229
239
 
230
- export function formatGithubDir(name : string, repo : string) {
231
- const {branch, commitHash} = parseGithubURL(repo);
232
- return path.join(getRootDir(), '.mops/_github', `${name}#${branch.replaceAll('/', '___')}` + (commitHash ? `@${commitHash}` : ''));
240
+ export function formatGithubDir(name: string, repo: string) {
241
+ const { branch, commitHash } = parseGithubURL(repo);
242
+ return path.join(
243
+ getRootDir(),
244
+ ".mops/_github",
245
+ `${name}#${branch.replaceAll("/", "___")}` +
246
+ (commitHash ? `@${commitHash}` : ""),
247
+ );
233
248
  }
234
249
 
235
- export function readDfxJson() : any {
236
- let dir = process.cwd();
237
- let dfxJson = null;
238
- for (let i = 0; i < 5; i++) {
239
- let file = path.resolve(dir, 'dfx.json');
240
- if (fs.existsSync(file)) {
241
- dfxJson = JSON.parse(fs.readFileSync(file).toString());
242
- break;
243
- }
244
- dir = path.resolve(dir, '..');
245
- }
246
- return dfxJson;
250
+ export function readDfxJson(): any {
251
+ let dir = process.cwd();
252
+ let dfxJson = null;
253
+ for (let i = 0; i < 5; i++) {
254
+ let file = path.resolve(dir, "dfx.json");
255
+ if (fs.existsSync(file)) {
256
+ dfxJson = JSON.parse(fs.readFileSync(file).toString());
257
+ break;
258
+ }
259
+ dir = path.resolve(dir, "..");
260
+ }
261
+ return dfxJson;
247
262
  }
248
263
 
249
264
  // warn on minor mismatch
250
265
  // err on major mismatch
251
266
  export async function checkApiCompatibility() {
252
- let actor = await mainActor();
253
- let backendApiVer = await actor.getApiVersion();
254
- if (backendApiVer.split('.')[0] !== apiVersion.split('.')[0]) {
255
- console.log(chalk.red('ERR: ') + `CLI incompatible with backend. CLI v${apiVersion}, Backend v${backendApiVer}`);
256
- console.log('Run ' + chalk.greenBright('mops self update') + ' to upgrade cli.');
257
- return false;
258
- }
259
- else if (backendApiVer.split('.')[1] !== apiVersion.split('.')[1]) {
260
- console.log('-'.repeat(50));
261
- console.log(chalk.yellow('WARN: ') + `CLI probably incompatible with backend. CLI v${apiVersion}, Backend v${backendApiVer}`);
262
- console.log('Recommended to run ' + chalk.greenBright('mops self update') + ' to upgrade cli.');
263
- console.log('-'.repeat(50));
264
- }
265
- return true;
267
+ let actor = await mainActor();
268
+ let backendApiVer = await actor.getApiVersion();
269
+ if (backendApiVer.split(".")[0] !== apiVersion.split(".")[0]) {
270
+ console.log(
271
+ chalk.red("ERR: ") +
272
+ `CLI incompatible with backend. CLI v${apiVersion}, Backend v${backendApiVer}`,
273
+ );
274
+ console.log(
275
+ "Run " + chalk.greenBright("mops self update") + " to upgrade cli.",
276
+ );
277
+ return false;
278
+ } else if (backendApiVer.split(".")[1] !== apiVersion.split(".")[1]) {
279
+ console.log("-".repeat(50));
280
+ console.log(
281
+ chalk.yellow("WARN: ") +
282
+ `CLI probably incompatible with backend. CLI v${apiVersion}, Backend v${backendApiVer}`,
283
+ );
284
+ console.log(
285
+ "Recommended to run " +
286
+ chalk.greenBright("mops self update") +
287
+ " to upgrade cli.",
288
+ );
289
+ console.log("-".repeat(50));
290
+ }
291
+ return true;
266
292
  }
267
293
 
268
294
  export function version() {
269
- let packageJson = JSON.parse(fs.readFileSync(new URL('./package.json', import.meta.url)).toString());
270
- return packageJson.version;
295
+ let packageJson = JSON.parse(
296
+ fs.readFileSync(new URL("./package.json", import.meta.url)).toString(),
297
+ );
298
+ return packageJson.version;
271
299
  }
272
300
 
273
301
  // compatibility with older versions
274
- export {
275
- getNetwork,
276
- mainActor,
277
- storageActor,
278
- getHighestVersion,
279
- };
302
+ export { getNetwork, mainActor, storageActor, getHighestVersion };
@@ -1,20 +1,19 @@
1
- import {getDependencyType} from './mops.js';
2
- import {mainActor} from './api/actors.js';
3
- import {getDepName} from './helpers/get-dep-name.js';
1
+ import { getDependencyType } from "./mops.js";
2
+ import { mainActor } from "./api/actors.js";
3
+ import { getDepName } from "./helpers/get-dep-name.js";
4
4
 
5
- export async function notifyInstalls(installedDeps : Record<string, string>) {
6
- let packages = Object.entries(installedDeps)
7
- .filter(([_, version]) => getDependencyType(version) === 'mops')
8
- .map(([name, version]) => [getDepName(name), version] as [string, string]);
5
+ export async function notifyInstalls(installedDeps: Record<string, string>) {
6
+ let packages = Object.entries(installedDeps)
7
+ .filter(([_, version]) => getDependencyType(version) === "mops")
8
+ .map(([name, version]) => [getDepName(name), version] as [string, string]);
9
9
 
10
- if (packages.length) {
11
- let actor = await mainActor();
10
+ if (packages.length) {
11
+ let actor = await mainActor();
12
12
 
13
- try {
14
- await actor.notifyInstalls(packages);
15
- }
16
- catch (err) {
17
- // console.error('Failed to notify installs:', err);
18
- }
19
- }
20
- }
13
+ try {
14
+ await actor.notifyInstalls(packages);
15
+ } catch (err) {
16
+ // console.error('Failed to notify installs:', err);
17
+ }
18
+ }
19
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ic-mops",
3
- "version": "1.12.0",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "mops": "dist/bin/mops.js",
@@ -15,33 +15,39 @@
15
15
  "!build.sh",
16
16
  "!DEVELOPMENT.md",
17
17
  "!.mops",
18
- "/templates"
18
+ "/templates",
19
+ "/wasm"
19
20
  ],
20
21
  "homepage": "https://mops.one",
21
22
  "repository": {
22
23
  "type": "git",
23
- "url": "https://github.com/ZenVoich/mops.git"
24
+ "url": "https://github.com/caffeinelabs/mops.git"
24
25
  },
25
- "author": "Zen Voich <zen.voich@gmail.com>",
26
+ "author": "DFINITY",
26
27
  "license": "MIT",
27
28
  "engines": {
28
29
  "node": ">=18.0.0"
29
30
  },
30
31
  "scripts": {
31
- "build": "npm run prepare && npm run bundle",
32
- "dist": "tsc",
33
- "bundle": "rm -rf ./bundle && bun build ./cli.ts --outdir ./bundle --target node --minify --external @napi-rs/lzma --external fsevents --format esm --define '__dirname=import.meta.dirname' && npm run bundle:fix && npm run bundle:copy && npm run bundle:package-json && npm run bundle:tar",
32
+ "mops": "tsx ./environments/nodejs/cli",
33
+ "build": "run-s prepare bundle",
34
+ "build:wasm": "run-s build:wasm:nodejs build:wasm:web",
35
+ "build:wasm:nodejs": "wasm-pack build wasm --target nodejs --out-dir pkg/nodejs && rm wasm/pkg/nodejs/.gitignore",
36
+ "build:wasm:web": "wasm-pack build wasm --target web --out-dir pkg/web && rm wasm/pkg/web/.gitignore",
37
+ "dist": "npm run build:wasm && tsc && mkdir -p dist/wasm && cp -r wasm/pkg dist/wasm",
38
+ "bundle": "rm -rf ./bundle && bun build ./environments/web/cli.ts --outdir ./bundle --target node --minify --external @napi-rs/lzma --external fsevents --format esm --define '__dirname=import.meta.dirname' && run-s bundle:fix bundle:copy bundle:package-json bundle:tar",
34
39
  "bundle:fix": "rexreplace 'new URL\\(\"\\.\\./templates' 'new URL(\"./templates' bundle/cli.js && rexreplace 'resolve\\(\".*?/xhr-sync-worker\\.js\"\\)' 'resolve(\"./xhr-sync-worker.js\")' bundle/cli.js && rexreplace '\"import.meta.dirname\",\"wasm_bg.wasm\"' 'import.meta.dirname || new URL(\".\", import.meta.url).pathname,\"wasm_bg.wasm\"' bundle/cli.js",
35
40
  "bundle:copy": "cp -r commands/bench bundle && cp -r bin declarations templates package.json bundle && cp -r node_modules/prettier-plugin-motoko/wasm/pkg/nodejs/wasm_bg.wasm node_modules/jsdom/lib/jsdom/living/xhr/xhr-sync-worker.js bundle",
36
41
  "bundle:package-json": "tsx bundle-package-json.ts",
37
42
  "bundle:tar": "rm -f bundle/cli.tgz && touch -t 200101010101 bundle/cli.tgz && find bundle -exec touch -d '1970-01-01 00:00:00' {} + && tar --sort name --exclude bundle/cli.tgz -cvf - bundle | gzip -n > bundle/cli.tgz",
38
43
  "copy": "cp -r commands/bench dist/commands && cp -r declarations templates package.json bin dist | true",
39
- "prepare": "rm -rf dist && npm run dist && npm run copy && npm run fix-dist",
44
+ "prepare": "rm -rf dist && run-s dist copy fix-dist",
40
45
  "fix-dist": "tsx ./fix-dist.ts",
41
46
  "release": "tsx release-cli.ts",
42
47
  "check": "tsc --project tsconfig.json --noEmit",
43
48
  "tsc": "tsc",
44
- "esbuild": "esbuild"
49
+ "esbuild": "esbuild",
50
+ "test": "NODE_OPTIONS=\"--experimental-vm-modules\" jest"
45
51
  },
46
52
  "dependencies": {
47
53
  "@iarna/toml": "2.2.5",
@@ -103,8 +109,11 @@
103
109
  "@types/tar": "6.1.13",
104
110
  "esbuild": "0.23.1",
105
111
  "eslint": "8.57.0",
112
+ "npm-run-all": "4.1.5",
106
113
  "rexreplace": "7.1.13",
114
+ "ts-jest": "29.4.5",
107
115
  "tsx": "4.19.2",
108
- "typescript": "5.9.2"
116
+ "typescript": "5.9.2",
117
+ "wasm-pack": "0.13.1"
109
118
  }
110
119
  }