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
package/commands/init.ts CHANGED
@@ -1,279 +1,305 @@
1
- import process from 'node:process';
2
- import {execSync} from 'node:child_process';
3
- import path from 'node:path';
4
- import {existsSync, readFileSync, writeFileSync} from 'node:fs';
5
- import chalk from 'chalk';
6
- import prompts from 'prompts';
7
-
8
- import {checkApiCompatibility, writeConfig} from '../mops.js';
9
- import {mainActor} from '../api/actors.js';
10
- import {installAll} from './install/install-all.js';
11
- import {VesselConfig, readVesselConfig} from '../vessel.js';
12
- import {Config, Dependencies} from '../types.js';
13
- import {template} from './template.js';
14
- import {kebabCase} from 'change-case';
15
-
16
- export async function init({yes = false} = {}) {
17
- let configFile = path.join(process.cwd(), 'mops.toml');
18
- let exists = existsSync(configFile);
19
- if (exists) {
20
- console.log(chalk.yellow('mops.toml already exists'));
21
- return;
22
- }
23
-
24
- console.log('Initializing...');
25
-
26
- let config : Config = {};
27
-
28
- if (yes) {
29
- await applyInit({
30
- type: 'project',
31
- config,
32
- setupWorkflow: true,
33
- addTest: false,
34
- copyrightOwner: '',
35
- });
36
- return;
37
- }
38
-
39
- // migrate from vessel
40
- let vesselFile = path.join(process.cwd(), 'vessel.dhall');
41
- let vesselConfig : VesselConfig = {dependencies: [], 'dev-dependencies': []};
42
-
43
- if (existsSync(vesselFile)) {
44
- console.log('Reading vessel.dhall file');
45
- let res = await readVesselConfig(process.cwd(), {cache: false});
46
- if (res) {
47
- vesselConfig = {...res};
48
- }
49
- }
50
-
51
- if (vesselConfig.dependencies) {
52
- let deps : Dependencies = {};
53
- deps = {};
54
-
55
- for (const dep of (vesselConfig.dependencies || [])) {
56
- deps[dep.name] = dep;
57
- }
58
-
59
- if (Object.keys(deps).length) {
60
- config.dependencies = deps;
61
- }
62
- }
63
-
64
- let promptsConfig = {
65
- onCancel() {
66
- console.log('aborted');
67
- process.exit(0);
68
- },
69
- };
70
-
71
- // type
72
- let {type} = await prompts({
73
- type: 'select',
74
- name: 'type',
75
- message: 'Select type:',
76
- choices: [
77
- {title: `Project ${chalk.dim('(I just want to use mops packages in my project)')}`, value: 'project'},
78
- {title: `Package ${chalk.dim('(I plan to publish this package on mops)')}`, value: 'package'},
79
- ],
80
- }, promptsConfig);
81
-
82
- let addTest = false;
83
- let copyrightOwner = '';
84
-
85
- // package details
86
- if (type === 'package') {
87
- let res = await prompts([
88
- {
89
- type: 'text',
90
- name: 'name',
91
- message: 'Enter package name:',
92
- initial: kebabCase(path.basename(process.cwd())),
93
- },
94
- {
95
- type: 'text',
96
- name: 'description',
97
- message: 'Enter package description:',
98
- initial: '',
99
- },
100
- {
101
- type: 'text',
102
- name: 'repository',
103
- message: 'Enter package repository url:',
104
- initial: '',
105
- },
106
- {
107
- type: 'text',
108
- name: 'keywords',
109
- message: 'Enter keywords separated by spaces:',
110
- initial: '',
111
- },
112
- {
113
- type: 'select',
114
- name: 'license',
115
- message: 'Choose a license:',
116
- choices: [
117
- {title: 'MIT', value: 'MIT'},
118
- {title: 'Apache-2.0', value: 'Apache-2.0'},
119
- ],
120
- initial: 0,
121
- },
122
- {
123
- type: 'text',
124
- name: 'copyrightOwner',
125
- message: 'Enter license copyright owner:',
126
- initial: '',
127
- },
128
- {
129
- type: 'confirm',
130
- name: 'addTest',
131
- message: `Add example test file? ${chalk.dim('(test/lib.test.mo)')}`,
132
- initial: true,
133
- },
134
- ], promptsConfig);
135
-
136
- config.package = {
137
- name: kebabCase((res.name || '').trim()),
138
- version: '1.0.0',
139
- description: (res.description || '').trim(),
140
- repository: (res.repository || '').trim(),
141
- keywords: [...new Set(res.keywords.split(' ').filter(Boolean))] as string[],
142
- license: (res.license || '').trim(),
143
- };
144
-
145
- addTest = res.addTest;
146
- copyrightOwner = res.copyrightOwner;
147
- }
148
-
149
- // GitHub workflow
150
- let {setupWorkflow} = await prompts({
151
- type: 'confirm',
152
- name: 'setupWorkflow',
153
- message: `Setup GitHub workflow? ${chalk.dim('(run `mops test` on push)')}`,
154
- initial: true,
155
- }, promptsConfig);
156
-
157
- await applyInit({
158
- type,
159
- config,
160
- setupWorkflow,
161
- addTest,
162
- copyrightOwner,
163
- });
1
+ import process from "node:process";
2
+ import { execSync } from "node:child_process";
3
+ import path from "node:path";
4
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
5
+ import chalk from "chalk";
6
+ import prompts from "prompts";
7
+
8
+ import { checkApiCompatibility, writeConfig } from "../mops.js";
9
+ import { mainActor } from "../api/actors.js";
10
+ import { installAll } from "./install/install-all.js";
11
+ import { VesselConfig, readVesselConfig } from "../vessel.js";
12
+ import { Config, Dependencies } from "../types.js";
13
+ import { template } from "./template.js";
14
+ import { kebabCase } from "change-case";
15
+
16
+ export async function init({ yes = false } = {}) {
17
+ let configFile = path.join(process.cwd(), "mops.toml");
18
+ let exists = existsSync(configFile);
19
+ if (exists) {
20
+ console.log(chalk.yellow("mops.toml already exists"));
21
+ return;
22
+ }
23
+
24
+ console.log("Initializing...");
25
+
26
+ let config: Config = {};
27
+
28
+ if (yes) {
29
+ await applyInit({
30
+ type: "project",
31
+ config,
32
+ setupWorkflow: true,
33
+ addTest: false,
34
+ copyrightOwner: "",
35
+ });
36
+ return;
37
+ }
38
+
39
+ // migrate from vessel
40
+ let vesselFile = path.join(process.cwd(), "vessel.dhall");
41
+ let vesselConfig: VesselConfig = { dependencies: [], "dev-dependencies": [] };
42
+
43
+ if (existsSync(vesselFile)) {
44
+ console.log("Reading vessel.dhall file");
45
+ let res = await readVesselConfig(process.cwd(), { cache: false });
46
+ if (res) {
47
+ vesselConfig = { ...res };
48
+ }
49
+ }
50
+
51
+ if (vesselConfig.dependencies) {
52
+ let deps: Dependencies = {};
53
+ deps = {};
54
+
55
+ for (const dep of vesselConfig.dependencies || []) {
56
+ deps[dep.name] = dep;
57
+ }
58
+
59
+ if (Object.keys(deps).length) {
60
+ config.dependencies = deps;
61
+ }
62
+ }
63
+
64
+ let promptsConfig = {
65
+ onCancel() {
66
+ console.log("aborted");
67
+ process.exit(0);
68
+ },
69
+ };
70
+
71
+ // type
72
+ let { type } = await prompts(
73
+ {
74
+ type: "select",
75
+ name: "type",
76
+ message: "Select type:",
77
+ choices: [
78
+ {
79
+ title: `Project ${chalk.dim("(I just want to use mops packages in my project)")}`,
80
+ value: "project",
81
+ },
82
+ {
83
+ title: `Package ${chalk.dim("(I plan to publish this package on mops)")}`,
84
+ value: "package",
85
+ },
86
+ ],
87
+ },
88
+ promptsConfig,
89
+ );
90
+
91
+ let addTest = false;
92
+ let copyrightOwner = "";
93
+
94
+ // package details
95
+ if (type === "package") {
96
+ let res = await prompts(
97
+ [
98
+ {
99
+ type: "text",
100
+ name: "name",
101
+ message: "Enter package name:",
102
+ initial: kebabCase(path.basename(process.cwd())),
103
+ },
104
+ {
105
+ type: "text",
106
+ name: "description",
107
+ message: "Enter package description:",
108
+ initial: "",
109
+ },
110
+ {
111
+ type: "text",
112
+ name: "repository",
113
+ message: "Enter package repository url:",
114
+ initial: "",
115
+ },
116
+ {
117
+ type: "text",
118
+ name: "keywords",
119
+ message: "Enter keywords separated by spaces:",
120
+ initial: "",
121
+ },
122
+ {
123
+ type: "select",
124
+ name: "license",
125
+ message: "Choose a license:",
126
+ choices: [
127
+ { title: "MIT", value: "MIT" },
128
+ { title: "Apache-2.0", value: "Apache-2.0" },
129
+ ],
130
+ initial: 0,
131
+ },
132
+ {
133
+ type: "text",
134
+ name: "copyrightOwner",
135
+ message: "Enter license copyright owner:",
136
+ initial: "",
137
+ },
138
+ {
139
+ type: "confirm",
140
+ name: "addTest",
141
+ message: `Add example test file? ${chalk.dim("(test/lib.test.mo)")}`,
142
+ initial: true,
143
+ },
144
+ ],
145
+ promptsConfig,
146
+ );
147
+
148
+ config.package = {
149
+ name: kebabCase((res.name || "").trim()),
150
+ version: "1.0.0",
151
+ description: (res.description || "").trim(),
152
+ repository: (res.repository || "").trim(),
153
+ keywords: [
154
+ ...new Set(res.keywords.split(" ").filter(Boolean)),
155
+ ] as string[],
156
+ license: (res.license || "").trim(),
157
+ };
158
+
159
+ addTest = res.addTest;
160
+ copyrightOwner = res.copyrightOwner;
161
+ }
162
+
163
+ // GitHub workflow
164
+ let { setupWorkflow } = await prompts(
165
+ {
166
+ type: "confirm",
167
+ name: "setupWorkflow",
168
+ message: `Setup GitHub workflow? ${chalk.dim("(run `mops test` on push)")}`,
169
+ initial: true,
170
+ },
171
+ promptsConfig,
172
+ );
173
+
174
+ await applyInit({
175
+ type,
176
+ config,
177
+ setupWorkflow,
178
+ addTest,
179
+ copyrightOwner,
180
+ });
164
181
  }
165
182
 
166
183
  type ApplyInitOptions = {
167
- type : 'project' | 'package';
168
- config : Config;
169
- setupWorkflow : boolean;
170
- addTest : boolean;
171
- copyrightOwner : string;
184
+ type: "project" | "package";
185
+ config: Config;
186
+ setupWorkflow: boolean;
187
+ addTest: boolean;
188
+ copyrightOwner: string;
189
+ };
190
+
191
+ async function applyInit({
192
+ type,
193
+ config,
194
+ setupWorkflow,
195
+ addTest,
196
+ copyrightOwner,
197
+ }: ApplyInitOptions) {
198
+ // set packtool in dfx.json
199
+ let dfxJson = path.resolve(process.cwd(), "dfx.json");
200
+ let dfxJsonData;
201
+ if (existsSync(dfxJson)) {
202
+ let dfxJsonText = readFileSync(dfxJson).toString();
203
+ try {
204
+ dfxJsonData = JSON.parse(dfxJsonText);
205
+ } catch (err) {
206
+ console.log(chalk.yellow("Failed to parse dfx.json"));
207
+ }
208
+ if (dfxJsonData) {
209
+ console.log("Setting packtool in dfx.json...");
210
+ dfxJsonData.defaults = dfxJsonData.defaults || {};
211
+ dfxJsonData.defaults.build = dfxJsonData.defaults.build || {};
212
+ if (dfxJsonData.defaults.build.packtool !== "mops sources") {
213
+ dfxJsonData.defaults.build.packtool = "mops sources";
214
+ let indent = dfxJsonText.match(/([ \t]+)"/)?.[1] || " ";
215
+ writeFileSync(
216
+ path.join(process.cwd(), "dfx.json"),
217
+ JSON.stringify(dfxJsonData, null, indent),
218
+ );
219
+ console.log(chalk.green('packtool set to "mops sources"'));
220
+ }
221
+ }
222
+ }
223
+
224
+ // get default packages
225
+ if (type === "project") {
226
+ let compatible = await checkApiCompatibility();
227
+ if (!compatible) {
228
+ return;
229
+ }
230
+
231
+ let dfxVersion = dfxJsonData?.dfx || "";
232
+ if (!dfxVersion) {
233
+ try {
234
+ let res = execSync("dfx --version").toString();
235
+ let match = res.match(/\d+\.\d+\.\d+/);
236
+ if (match) {
237
+ dfxVersion = match[0];
238
+ }
239
+ } catch {}
240
+ }
241
+
242
+ console.log(`Fetching default packages for dfx ${dfxVersion}...`);
243
+ let actor = await mainActor();
244
+ let defaultPackages = await actor.getDefaultPackages(dfxVersion);
245
+
246
+ if (!config.dependencies) {
247
+ config.dependencies = {};
248
+ }
249
+
250
+ for (let [name, version] of defaultPackages) {
251
+ config.dependencies[name] = { name, version };
252
+ }
253
+ }
254
+
255
+ // save config
256
+ let configFile = path.join(process.cwd(), "mops.toml");
257
+ writeConfig(config, configFile);
258
+ console.log(chalk.green("Created"), "mops.toml");
259
+
260
+ // add src/lib.mo
261
+ if (type === "package" && !existsSync(path.join(process.cwd(), "src"))) {
262
+ await template("lib.mo");
263
+ }
264
+
265
+ // add src/lib.test.mo
266
+ if (addTest && !existsSync(path.join(process.cwd(), "test"))) {
267
+ await template("lib.test.mo");
268
+ }
269
+
270
+ // add license
271
+ if (config.package?.license) {
272
+ await template(`license:${config.package.license}`, { copyrightOwner });
273
+ }
274
+
275
+ // add readme
276
+ if (type === "package") {
277
+ await template("readme");
278
+ }
279
+
280
+ // add GitHub workflow
281
+ if (setupWorkflow) {
282
+ await template("github-workflow:mops-test");
283
+ }
284
+
285
+ // add .mops to .gitignore
286
+ {
287
+ let gitignore = path.join(process.cwd(), ".gitignore");
288
+ let gitignoreData = existsSync(gitignore)
289
+ ? readFileSync(gitignore).toString()
290
+ : "";
291
+ let lf = gitignoreData.endsWith("\n") ? "\n" : "";
292
+ if (!gitignoreData.includes(".mops")) {
293
+ writeFileSync(gitignore, `${gitignoreData}\n.mops${lf}`.trimStart());
294
+ console.log(chalk.green("Added"), ".mops to .gitignore");
295
+ }
296
+ }
297
+
298
+ // install deps
299
+ if (Object.keys(config.dependencies || {}).length) {
300
+ console.log("Installing dependencies...");
301
+ await installAll({ verbose: true });
302
+ }
303
+
304
+ console.log(chalk.green("Done!"));
172
305
  }
173
-
174
- async function applyInit({type, config, setupWorkflow, addTest, copyrightOwner} : ApplyInitOptions) {
175
- // set packtool in dfx.json
176
- let dfxJson = path.resolve(process.cwd(), 'dfx.json');
177
- let dfxJsonData;
178
- if (existsSync(dfxJson)) {
179
- let dfxJsonText = readFileSync(dfxJson).toString();
180
- try {
181
- dfxJsonData = JSON.parse(dfxJsonText);
182
- }
183
- catch (err) {
184
- console.log(chalk.yellow('Failed to parse dfx.json'));
185
- }
186
- if (dfxJsonData) {
187
- console.log('Setting packtool in dfx.json...');
188
- dfxJsonData.defaults = dfxJsonData.defaults || {};
189
- dfxJsonData.defaults.build = dfxJsonData.defaults.build || {};
190
- if (dfxJsonData.defaults.build.packtool !== 'mops sources') {
191
- dfxJsonData.defaults.build.packtool = 'mops sources';
192
- let indent = dfxJsonText.match(/([ \t]+)"/)?.[1] || ' ';
193
- writeFileSync(path.join(process.cwd(), 'dfx.json'), JSON.stringify(dfxJsonData, null, indent));
194
- console.log(chalk.green('packtool set to "mops sources"'));
195
- }
196
- }
197
- }
198
-
199
- // get default packages
200
- if (type === 'project') {
201
- let compatible = await checkApiCompatibility();
202
- if (!compatible) {
203
- return;
204
- }
205
-
206
- let dfxVersion = dfxJsonData?.dfx || '';
207
- if (!dfxVersion) {
208
- try {
209
- let res = execSync('dfx --version').toString();
210
- let match = res.match(/\d+\.\d+\.\d+/);
211
- if (match) {
212
- dfxVersion = match[0];
213
- }
214
- }
215
- catch {}
216
- }
217
-
218
- console.log(`Fetching default packages for dfx ${dfxVersion}...`);
219
- let actor = await mainActor();
220
- let defaultPackages = await actor.getDefaultPackages(dfxVersion);
221
-
222
- if (!config.dependencies) {
223
- config.dependencies = {};
224
- }
225
-
226
- for (let [name, version] of defaultPackages) {
227
- config.dependencies[name] = {name, version};
228
- }
229
- }
230
-
231
- // save config
232
- let configFile = path.join(process.cwd(), 'mops.toml');
233
- writeConfig(config, configFile);
234
- console.log(chalk.green('Created'), 'mops.toml');
235
-
236
- // add src/lib.mo
237
- if (type === 'package' && !existsSync(path.join(process.cwd(), 'src'))) {
238
- await template('lib.mo');
239
- }
240
-
241
- // add src/lib.test.mo
242
- if (addTest && !existsSync(path.join(process.cwd(), 'test'))) {
243
- await template('lib.test.mo');
244
- }
245
-
246
- // add license
247
- if (config.package?.license) {
248
- await template(`license:${config.package.license}`, {copyrightOwner});
249
- }
250
-
251
- // add readme
252
- if (type === 'package') {
253
- await template('readme');
254
- }
255
-
256
- // add GitHub workflow
257
- if (setupWorkflow) {
258
- await template('github-workflow:mops-test');
259
- }
260
-
261
- // add .mops to .gitignore
262
- {
263
- let gitignore = path.join(process.cwd(), '.gitignore');
264
- let gitignoreData = existsSync(gitignore) ? readFileSync(gitignore).toString() : '';
265
- let lf = gitignoreData.endsWith('\n') ? '\n' : '';
266
- if (!gitignoreData.includes('.mops')) {
267
- writeFileSync(gitignore, `${gitignoreData}\n.mops${lf}`.trimStart());
268
- console.log(chalk.green('Added'), '.mops to .gitignore');
269
- }
270
- }
271
-
272
- // install deps
273
- if (Object.keys(config.dependencies || {}).length) {
274
- console.log('Installing dependencies...');
275
- await installAll({verbose: true});
276
- }
277
-
278
- console.log(chalk.green('Done!'));
279
- }