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/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
- }