ic-mops 0.37.0-pre.0 → 0.37.1

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 (102) hide show
  1. package/bin/moc-wrapper.sh +1 -52
  2. package/cache.ts +2 -2
  3. package/cli.ts +27 -6
  4. package/commands/add.ts +3 -1
  5. package/commands/bench-replica.ts +5 -3
  6. package/commands/docs.ts +9 -6
  7. package/commands/install-all.ts +7 -2
  8. package/commands/install.ts +5 -1
  9. package/commands/publish.ts +2 -0
  10. package/commands/test/test.ts +42 -19
  11. package/commands/toolchain/index.ts +214 -42
  12. package/commands/toolchain/moc.ts +19 -4
  13. package/commands/toolchain/pocket-ic.ts +43 -6
  14. package/commands/toolchain/toolchain-utils.ts +14 -5
  15. package/commands/toolchain/wasmtime.ts +19 -4
  16. package/dist/bin/mops.js +0 -0
  17. package/dist/cache.js +2 -2
  18. package/dist/cli.js +24 -6
  19. package/dist/commands/add.js +2 -1
  20. package/dist/commands/bench-replica.d.ts +1 -1
  21. package/dist/commands/bench-replica.js +5 -3
  22. package/dist/commands/docs.js +9 -6
  23. package/dist/commands/install-all.js +5 -2
  24. package/dist/commands/install.js +5 -1
  25. package/dist/commands/publish.js +1 -0
  26. package/dist/commands/test/test.js +41 -19
  27. package/dist/commands/toolchain/index.d.ts +17 -3
  28. package/dist/commands/toolchain/index.js +187 -40
  29. package/dist/commands/toolchain/moc.d.ts +5 -1
  30. package/dist/commands/toolchain/moc.js +16 -4
  31. package/dist/commands/toolchain/mocv.js +0 -1
  32. package/dist/commands/toolchain/pocket-ic.d.ts +9 -1
  33. package/dist/commands/toolchain/pocket-ic.js +40 -6
  34. package/dist/commands/toolchain/toolchain-utils.d.ts +1 -1
  35. package/dist/commands/toolchain/toolchain-utils.js +13 -4
  36. package/dist/commands/toolchain/wasmtime.d.ts +5 -1
  37. package/dist/commands/toolchain/wasmtime.js +16 -4
  38. package/dist/integrity.js +40 -15
  39. package/dist/mops.js +1 -1
  40. package/dist/package.json +3 -2
  41. package/dist/pic-js/examples/clock/tests/clock/index.d.ts +1 -0
  42. package/dist/pic-js/examples/clock/tests/clock/index.js +5 -0
  43. package/dist/pic-js/examples/clock/tests/jest.config.d.ts +3 -0
  44. package/dist/pic-js/examples/clock/tests/jest.config.js +8 -0
  45. package/dist/pic-js/examples/clock/tests/src/clock.spec.d.ts +1 -0
  46. package/dist/pic-js/examples/clock/tests/src/clock.spec.js +48 -0
  47. package/dist/pic-js/examples/counter/tests/counter/index.d.ts +1 -0
  48. package/dist/pic-js/examples/counter/tests/counter/index.js +5 -0
  49. package/dist/pic-js/examples/counter/tests/jest.config.d.ts +3 -0
  50. package/dist/pic-js/examples/counter/tests/jest.config.js +8 -0
  51. package/dist/pic-js/examples/counter/tests/src/counter.spec.d.ts +1 -0
  52. package/dist/pic-js/examples/counter/tests/src/counter.spec.js +80 -0
  53. package/dist/pic-js/examples/todo/tests/jest.config.d.ts +3 -0
  54. package/dist/pic-js/examples/todo/tests/jest.config.js +8 -0
  55. package/dist/pic-js/examples/todo/tests/src/todo.spec.d.ts +1 -0
  56. package/dist/pic-js/examples/todo/tests/src/todo.spec.js +211 -0
  57. package/dist/pic-js/examples/todo/tests/todo/index.d.ts +1 -0
  58. package/dist/pic-js/examples/todo/tests/todo/index.js +5 -0
  59. package/dist/pic-js/packages/pic/src/error.d.ts +12 -0
  60. package/dist/pic-js/packages/pic/src/error.js +36 -0
  61. package/dist/pic-js/packages/pic/src/http-client.d.ts +15 -0
  62. package/dist/pic-js/packages/pic/src/http-client.js +37 -0
  63. package/dist/pic-js/packages/pic/src/identity.d.ts +66 -0
  64. package/dist/pic-js/packages/pic/src/identity.js +86 -0
  65. package/dist/pic-js/packages/pic/src/index.d.ts +4 -0
  66. package/dist/pic-js/packages/pic/src/index.js +8 -0
  67. package/dist/pic-js/packages/pic/src/management-canister.d.ts +30 -0
  68. package/dist/pic-js/packages/pic/src/management-canister.js +43 -0
  69. package/dist/pic-js/packages/pic/src/pocket-ic-actor.d.ts +83 -0
  70. package/dist/pic-js/packages/pic/src/pocket-ic-actor.js +58 -0
  71. package/dist/pic-js/packages/pic/src/pocket-ic-client-types.d.ts +61 -0
  72. package/dist/pic-js/packages/pic/src/pocket-ic-client-types.js +2 -0
  73. package/dist/pic-js/packages/pic/src/pocket-ic-client.d.ts +24 -0
  74. package/dist/pic-js/packages/pic/src/pocket-ic-client.js +123 -0
  75. package/dist/pic-js/packages/pic/src/pocket-ic-server.d.ts +10 -0
  76. package/dist/pic-js/packages/pic/src/pocket-ic-server.js +55 -0
  77. package/dist/pic-js/packages/pic/src/pocket-ic-types.d.ts +40 -0
  78. package/dist/pic-js/packages/pic/src/pocket-ic-types.js +2 -0
  79. package/dist/pic-js/packages/pic/src/pocket-ic.d.ts +447 -0
  80. package/dist/pic-js/packages/pic/src/pocket-ic.js +551 -0
  81. package/dist/pic-js/packages/pic/src/util/candid.d.ts +1 -0
  82. package/dist/pic-js/packages/pic/src/util/candid.js +7 -0
  83. package/dist/pic-js/packages/pic/src/util/encoding.d.ts +5 -0
  84. package/dist/pic-js/packages/pic/src/util/encoding.js +19 -0
  85. package/dist/pic-js/packages/pic/src/util/fs.d.ts +4 -0
  86. package/dist/pic-js/packages/pic/src/util/fs.js +29 -0
  87. package/dist/pic-js/packages/pic/src/util/index.d.ts +5 -0
  88. package/dist/pic-js/packages/pic/src/util/index.js +21 -0
  89. package/dist/pic-js/packages/pic/src/util/os.d.ts +4 -0
  90. package/dist/pic-js/packages/pic/src/util/os.js +19 -0
  91. package/dist/pic-js/packages/pic/src/util/poll.d.ts +5 -0
  92. package/dist/pic-js/packages/pic/src/util/poll.js +28 -0
  93. package/dist/templates/mops-test.yml +4 -4
  94. package/dist/vessel.js +5 -1
  95. package/integrity.ts +57 -17
  96. package/mops.ts +1 -1
  97. package/package.json +3 -2
  98. package/templates/mops-test.yml +4 -4
  99. package/vessel.ts +6 -1
  100. package/bun.lockb +0 -0
  101. package/commands/toolchain/mocv.ts +0 -313
  102. package/moc-wrapper.ts +0 -10
@@ -2,14 +2,58 @@ import path from 'node:path';
2
2
  import fs from 'node:fs';
3
3
  import os from 'node:os';
4
4
  import {execSync} from 'node:child_process';
5
- import {getClosestConfigFile, globalCacheDir, readConfig, writeConfig} from '../../mops.js';
6
- import * as moc from './moc.js';
7
- import {Tool} from '../../types.js';
8
5
  import chalk from 'chalk';
6
+ import prompts from 'prompts';
7
+ import {createLogUpdate} from 'log-update';
8
+ import {checkConfigFile, getClosestConfigFile, getRootDir, globalCacheDir, readConfig, writeConfig} from '../../mops.js';
9
+ import {Tool} from '../../types.js';
10
+ import * as moc from './moc.js';
11
+ import * as pocketIc from './pocket-ic.js';
12
+ import * as wasmtime from './wasmtime.js';
9
13
 
14
+ function getToolUtils(tool: Tool) {
15
+ if (tool === 'moc') {
16
+ return moc;
17
+ }
18
+ else if (tool === 'pocket-ic') {
19
+ return pocketIc;
20
+ }
21
+ else if (tool === 'wasmtime') {
22
+ return wasmtime;
23
+ }
24
+ else {
25
+ console.error(`Unknown tool '${tool}'`);
26
+ process.exit(1);
27
+ }
28
+ }
29
+
30
+ async function ensureToolchainInited({strict = true} = {}) {
31
+ // auto init in CI
32
+ if (process.env.CI) {
33
+ await init({silent: true});
34
+ return true;
35
+ }
36
+
37
+ // for non-stict perform check only if dfx.json exists and moc is listed in [toolchain] section
38
+ let rootDir = getRootDir();
39
+ let config = readConfig();
40
+ if (!strict && (!config.toolchain?.moc || rootDir && !fs.existsSync(path.join(rootDir, 'dfx.json')))) {
41
+ return true;
42
+ }
43
+
44
+ try {
45
+ let res = execSync('which moc-wrapper').toString().trim();
46
+ if (res && process.env.DFX_MOC_PATH === 'moc-wrapper') {
47
+ return true;
48
+ }
49
+ }
50
+ catch {}
51
+ console.error('Toolchain management is not initialized. Run "mops toolchain init"');
52
+ process.exit(1);
53
+ }
10
54
 
11
55
  // update shell config files to set DFX_MOC_PATH to moc-wrapper
12
- async function init({reset = false} = {}) {
56
+ async function init({reset = false, silent = false} = {}) {
13
57
  if (process.platform == 'win32') {
14
58
  console.error('Windows is not supported. Please use WSL');
15
59
  process.exit(1);
@@ -30,7 +74,7 @@ async function init({reset = false} = {}) {
30
74
  let zshrc = path.join(os.homedir(), '.zshrc');
31
75
  let bashrc = path.join(os.homedir(), '.bashrc');
32
76
 
33
- let shellConfigFiles = [bashrc, zshrc].filter((file) => {
77
+ let shellConfigFiles = [bashrc, zshrc, process.env.GITHUB_ENV || ''].map(x => x).filter((file) => {
34
78
  return fs.existsSync(file);
35
79
  });
36
80
 
@@ -40,12 +84,12 @@ async function init({reset = false} = {}) {
40
84
  }
41
85
 
42
86
  // update all existing shell config files
43
- for (let configFile of shellConfigFiles) {
44
- let text = fs.readFileSync(configFile).toString();
45
- let setDfxLine = '\nexport DFX_MOC_PATH="moc-wrapper"';
87
+ for (let shellConfigFile of shellConfigFiles) {
88
+ let text = fs.readFileSync(shellConfigFile).toString();
89
+ let setDfxMocPathLine = '\nexport DFX_MOC_PATH=moc-wrapper';
46
90
 
47
91
  let newLines = [
48
- setDfxLine,
92
+ setDfxMocPathLine,
49
93
  ];
50
94
 
51
95
  let oldLines = [
@@ -53,7 +97,7 @@ async function init({reset = false} = {}) {
53
97
  `\nexport DFX_MOC_PATH=${path.join(path.join(os.homedir(), '.cache/mocv'), 'versions/current')}/moc`,
54
98
  '\nexport DFX_MOC_PATH="$HOME/.cache/mocv/versions/current/moc"',
55
99
  // new
56
- setDfxLine,
100
+ setDfxMocPathLine,
57
101
  ];
58
102
 
59
103
  // remove old lines
@@ -71,83 +115,211 @@ async function init({reset = false} = {}) {
71
115
  text += '\n';
72
116
  }
73
117
  for (let newLine of newLines) {
118
+ if (shellConfigFile === process.env.GITHUB_ENV) {
119
+ newLine = newLine.replace('export ', '');
120
+ }
74
121
  text += newLine;
75
122
  }
76
123
  text += '\n';
77
124
  }
78
125
 
79
- fs.writeFileSync(configFile, text);
126
+ fs.writeFileSync(shellConfigFile, text);
80
127
  }
81
128
 
82
- console.log(chalk.green('Success!'));
129
+ if (!silent) {
130
+ console.log(chalk.green('Success!'));
131
+ console.log('Restart terminal to apply changes');
132
+ }
83
133
  }
84
134
 
85
- async function download(tool: Tool, version: string) {
86
- if (tool === 'moc') {
87
- await moc.download(version);
135
+ async function download(tool: Tool, version: string, {silent = false, verbose = false} = {}) {
136
+ let toolUtils = getToolUtils(tool);
137
+ await toolUtils.download(version, {silent, verbose});
138
+ }
139
+
140
+ async function installAll({silent = false, verbose = false} = {}) {
141
+ let config = readConfig();
142
+
143
+ if (!config.toolchain) {
144
+ return;
145
+ }
146
+
147
+ let logUpdate = createLogUpdate(process.stdout, {showCursor: true});
148
+
149
+ let log = (...args: string[]) => {
150
+ if (silent) {
151
+ return;
152
+ }
153
+ if (verbose) {
154
+ console.log(...args);
155
+ }
156
+ else {
157
+ logUpdate(...args);
158
+ }
159
+ };
160
+
161
+ log('Installing toolchain...');
162
+
163
+ if (config.toolchain?.moc) {
164
+ log('Installing moc', config.toolchain.moc);
165
+ await download('moc', config.toolchain.moc, {verbose});
166
+ }
167
+ if (config.toolchain?.wasmtime) {
168
+ log('Installing wasmtime', config.toolchain.wasmtime);
169
+ await download('wasmtime', config.toolchain.wasmtime, {verbose});
170
+ }
171
+ if (config.toolchain?.['pocket-ic']) {
172
+ log('Installing pocket-ic', config.toolchain['pocket-ic']);
173
+ await download('pocket-ic', config.toolchain['pocket-ic'], {verbose});
174
+ }
175
+
176
+ if (!silent) {
177
+ logUpdate.clear();
178
+ console.log(chalk.green('Toolchain installed'));
88
179
  }
89
180
  }
90
181
 
91
- // async function downloadAll() {
92
- // let config = readConfig();
93
- // if (config.toolchain?.moc) {
94
- // await download('moc', config.toolchain.moc);
95
- // }
96
- // if (config.toolchain?.wasmtime) {
97
- // await download('wasmtime', config.toolchain.wasmtime);
98
- // }
99
- // if (config.toolchain?.['pocket-ic']) {
100
- // await download('pocket-ic', config.toolchain['pocket-ic']);
101
- // }
102
- // }
182
+ async function promptVersion(tool: Tool): Promise<string> {
183
+ let config = readConfig();
184
+ config.toolchain = config.toolchain || {};
185
+ let current = config.toolchain[tool];
186
+
187
+ let toolUtils = getToolUtils(tool);
188
+ let releases = await toolUtils.getReleases();
189
+ let versions = releases.map((item: {tag_name: any;}) => item.tag_name);
190
+ let currentIndex = versions.indexOf(current);
191
+
192
+ let res = await prompts({
193
+ type: 'select',
194
+ name: 'version',
195
+ message: `Select ${tool} version`,
196
+ choices: releases.map((release: {published_at: string | number | Date; tag_name: string;}, i: any) => {
197
+ let date = new Date(release.published_at).toLocaleDateString(undefined, {year: 'numeric', month: 'short', day: 'numeric'});
198
+ return {
199
+ title: release.tag_name + chalk.gray(` ${date}${currentIndex === i ? chalk.italic(' (current)') : ''}`),
200
+ value: release.tag_name,
201
+ };
202
+ }),
203
+ initial: currentIndex == -1 ? 0 : currentIndex,
204
+ });
205
+
206
+ return res.version;
207
+ }
103
208
 
104
209
  // download binary and set version in mops.toml
105
- async function use(tool: Tool, version: string) {
210
+ async function use(tool: Tool, version?: string) {
211
+ if (tool === 'moc') {
212
+ await ensureToolchainInited();
213
+ }
214
+ if (!version) {
215
+ version = await promptVersion(tool);
216
+ }
217
+ if (!version) {
218
+ return;
219
+ }
220
+ if (version === 'latest') {
221
+ version = await getToolUtils(tool).getLatestReleaseTag();
222
+ }
223
+
106
224
  await download(tool, version);
107
225
 
108
226
  let config = readConfig();
109
227
  config.toolchain = config.toolchain || {};
228
+
229
+ let oldVersion = config.toolchain[tool];
230
+
110
231
  config.toolchain[tool] = version;
111
232
  writeConfig(config);
233
+
234
+ if (oldVersion === version) {
235
+ console.log((`${tool} ${version} is already installed`));
236
+ }
237
+ else {
238
+ console.log(chalk.green(`Installed ${tool} ${version}`));
239
+ }
240
+ }
241
+
242
+ // download latest binary and set version in mops.toml
243
+ async function update(tool?: Tool) {
244
+ if (tool === 'moc') {
245
+ await ensureToolchainInited();
246
+ }
247
+
248
+ let config = readConfig();
249
+ config.toolchain = config.toolchain || {};
250
+
251
+ let tools = tool ? [tool] : Object.keys(config.toolchain) as Tool[];
252
+
253
+ for (let tool of tools) {
254
+ if (!config.toolchain[tool]) {
255
+ console.error(`Tool '${tool}' is not defined in [toolchain] section in mops.toml`);
256
+ process.exit(1);
257
+ }
258
+
259
+ let toolUtils = getToolUtils(tool);
260
+ let version = await toolUtils.getLatestReleaseTag();
261
+
262
+ await download(tool, version);
263
+
264
+ let oldVersion = config.toolchain[tool];
265
+ config.toolchain[tool] = version;
266
+ writeConfig(config);
267
+
268
+ if (oldVersion === version) {
269
+ console.log((`Latest ${tool} ${version} is already installed`));
270
+ }
271
+ else {
272
+ console.log(chalk.green(`Installed ${tool} ${version}`));
273
+ }
274
+ }
112
275
  }
113
276
 
114
277
  // return current version from mops.toml
115
- async function bin(tool: Tool) {
278
+ async function bin(tool: Tool, {fallback = false} = {}): Promise<string> {
116
279
  let hasConfig = getClosestConfigFile();
117
280
 
118
281
  // fallback to dfx moc
119
282
  if (!hasConfig) {
120
- console.log(execSync('dfx cache show').toString().trim() + '/moc');
121
- return;
283
+ if (tool === 'moc' && fallback) {
284
+ return execSync('dfx cache show').toString().trim() + '/moc';
285
+ }
286
+ checkConfigFile();
287
+ process.exit(1);
122
288
  }
123
289
 
124
290
  let config = readConfig();
125
291
  let version = config.toolchain?.[tool];
126
292
 
127
- if (!version) {
128
- // fallback to dfx moc
293
+ if (version) {
129
294
  if (tool === 'moc') {
130
- console.log(execSync('dfx cache show').toString().trim() + '/moc');
131
- return;
295
+ await ensureToolchainInited();
132
296
  }
133
- console.error(`Toolchain '${tool}' is not defined in mops.toml`);
134
- process.exit(1);
135
- }
136
297
 
137
- if (version) {
138
- await download(tool, version);
298
+ await download(tool, version, {silent: true});
139
299
 
140
300
  if (tool === 'moc') {
141
- console.log(path.join(globalCacheDir, 'moc', version, 'moc'));
301
+ return path.join(globalCacheDir, 'moc', version, tool);
142
302
  }
143
303
  else {
144
- console.log(path.join(globalCacheDir, tool, version, 'moc'));
304
+ return path.join(globalCacheDir, tool, version, tool);
305
+ }
306
+ }
307
+ else {
308
+ // fallback to dfx moc
309
+ if (tool === 'moc' && fallback) {
310
+ return execSync('dfx cache show').toString().trim() + '/moc';
145
311
  }
312
+ console.error(`Tool '${tool}' is not defined in [toolchain] section in mops.toml`);
313
+ console.log(`Run ${chalk.green(`mops toolchain use ${tool}`)} to install it`);
314
+ process.exit(1);
146
315
  }
147
316
  }
148
317
 
149
318
  export let toolchain = {
150
319
  init,
151
320
  use,
321
+ update,
152
322
  bin,
323
+ installAll,
324
+ ensureToolchainInited,
153
325
  };
@@ -2,16 +2,26 @@ import path from 'node:path';
2
2
  import fs from 'fs-extra';
3
3
 
4
4
  import {globalCacheDir} from '../../mops.js';
5
- import {downloadAndExtract} from './toolchain-utils.js';
5
+ import * as toolchainUtils from './toolchain-utils.js';
6
6
 
7
7
  let cacheDir = path.join(globalCacheDir, 'moc');
8
8
 
9
+ export let repo = 'dfinity/motoko';
10
+
11
+ export let getLatestReleaseTag = async () => {
12
+ return toolchainUtils.getLatestReleaseTag(repo);
13
+ };
14
+
15
+ export let getReleases = async () => {
16
+ return toolchainUtils.getReleases(repo);
17
+ };
18
+
9
19
  export let isCached = (version: string) => {
10
20
  let dir = path.join(cacheDir, version);
11
21
  return fs.existsSync(dir) && fs.existsSync(path.join(dir, 'moc'));
12
22
  };
13
23
 
14
- export let download = async (version: string, {silent = false} = {}) => {
24
+ export let download = async (version: string, {silent = false, verbose = false} = {}) => {
15
25
  if (process.platform == 'win32') {
16
26
  console.error('Windows is not supported. Please use WSL');
17
27
  process.exit(1);
@@ -21,6 +31,9 @@ export let download = async (version: string, {silent = false} = {}) => {
21
31
  process.exit(1);
22
32
  }
23
33
  if (isCached(version)) {
34
+ if (verbose) {
35
+ console.log(`moc ${version} is already installed`);
36
+ }
24
37
  return;
25
38
  }
26
39
 
@@ -37,7 +50,9 @@ export let download = async (version: string, {silent = false} = {}) => {
37
50
  url = `https://github.com/dfinity/motoko/releases/download/${version}/motoko-${platfrom}-${version}.tar.gz`;
38
51
  }
39
52
 
40
- silent || console.log(`Downloading ${url}`);
53
+ if (verbose && !silent) {
54
+ console.log(`Downloading ${url}`);
55
+ }
41
56
 
42
- await downloadAndExtract(url, path.join(cacheDir, version));
57
+ await toolchainUtils.downloadAndExtract(url, path.join(cacheDir, version));
43
58
  };
@@ -2,21 +2,56 @@ import path from 'node:path';
2
2
  import fs from 'node:fs';
3
3
 
4
4
  import {globalCacheDir} from '../../mops.js';
5
- import {downloadAndExtract} from './toolchain-utils.js';
5
+ import * as toolchainUtils from './toolchain-utils.js';
6
6
 
7
7
  let cacheDir = path.join(globalCacheDir, 'pocket-ic');
8
8
 
9
+ export let repo = 'dfinity/pocketic';
10
+
11
+ export let getLatestReleaseTag = async () => {
12
+ return '1.0.0';
13
+ // return toolchainUtils.getLatestReleaseTag(repo);
14
+ };
15
+
16
+ export let getReleases = async () => {
17
+ // return toolchainUtils.getReleases(repo);
18
+ return [
19
+ // {
20
+ // tag_name: '2.0.1',
21
+ // published_at: new Date('2023-11-23'),
22
+ // draft: false,
23
+ // },
24
+ // {
25
+ // tag_name: '2.0.0',
26
+ // published_at: new Date('2023-11-21'),
27
+ // draft: false,
28
+ // },
29
+ {
30
+ tag_name: '1.0.0',
31
+ published_at: new Date('2023-10-12'),
32
+ draft: false,
33
+ },
34
+ ];
35
+ };
36
+
9
37
  export let isCached = (version: string) => {
10
38
  let dir = path.join(cacheDir, version);
11
39
  return fs.existsSync(dir) && fs.existsSync(path.join(dir, 'pocket-ic'));
12
40
  };
13
41
 
14
- export let download = async (version: string, {silent = false} = {}) => {
42
+ export let download = async (version: string, {silent = false, verbose = false} = {}) => {
15
43
  if (!version) {
16
44
  console.error('version is not defined');
17
45
  process.exit(1);
18
46
  }
47
+ if (version !== '1.0.0') {
48
+ console.error('Currently only pocket-ic 1.0.0 is supported');
49
+ process.exit(1);
50
+ }
19
51
  if (isCached(version)) {
52
+ if (verbose) {
53
+ console.log(`pocket-ic ${version} is already installed`);
54
+ }
20
55
  return;
21
56
  }
22
57
 
@@ -24,14 +59,16 @@ export let download = async (version: string, {silent = false} = {}) => {
24
59
  let arch = 'x86_64';
25
60
 
26
61
  let hashes: Record<string, string> = {
27
- '2.0.1': '69e1408347723dbaa7a6cd2faa9b65c42abbe861',
28
- '2.0.0': '29ec86dc9f9ca4691d4d4386c8b2aa41e14d9d16',
62
+ // '2.0.1': '69e1408347723dbaa7a6cd2faa9b65c42abbe861',
63
+ // '2.0.0': '29ec86dc9f9ca4691d4d4386c8b2aa41e14d9d16',
29
64
  '1.0.0': '307d5847c1d2fe1f5e19181c7d0fcec23f4658b3',
30
65
  };
31
66
 
32
67
  let url = `https://download.dfinity.systems/ic/${hashes[version]}/openssl-static-binaries/${arch}-${platfrom}/pocket-ic.gz`;
33
68
 
34
- silent || console.log(`Downloading ${url}`);
69
+ if (verbose && !silent) {
70
+ console.log(`Downloading ${url}`);
71
+ }
35
72
 
36
- await downloadAndExtract(url, path.join(cacheDir, version));
73
+ await toolchainUtils.downloadAndExtract(url, path.join(cacheDir, version));
37
74
  };
@@ -30,12 +30,12 @@ export let downloadAndExtract = async (url: string, dest: string) => {
30
30
  fs.mkdirSync(dest, {recursive: true});
31
31
 
32
32
  if (archive.endsWith('.xz')) {
33
- await decompress(archive, dest, {
34
- strip: 1,
33
+ await decompress(archive, tmpDir, {
35
34
  plugins: [decompressTarxz()],
36
35
  }).catch(() => {
37
36
  deleteSync([tmpDir]);
38
37
  });
38
+ fs.cpSync(path.join(tmpDir, path.parse(archive).name.replace('.tar', '')), dest, {recursive: true});
39
39
  }
40
40
  else if (archive.endsWith('tar.gz')) {
41
41
  await tar.extract({
@@ -52,10 +52,14 @@ export let downloadAndExtract = async (url: string, dest: string) => {
52
52
  deleteSync([tmpDir], {force: true});
53
53
  };
54
54
 
55
- export let getLatestReleaseTag = async (repo: string): Promise<string | undefined> => {
55
+ export let getLatestReleaseTag = async (repo: string): Promise<string> => {
56
56
  let releases = await getReleases(repo);
57
57
  let release = releases.find((release: any) => !release.prerelease && !release.draft);
58
- return release?.tag_name;
58
+ if (!release?.tag_name) {
59
+ console.error(`Failed to fetch latest release tag for ${repo}`);
60
+ process.exit(1);
61
+ }
62
+ return release.tag_name.replace(/^v/, '');
59
63
  };
60
64
 
61
65
  export let getReleases = async (repo: string) => {
@@ -70,5 +74,10 @@ export let getReleases = async (repo: string) => {
70
74
  console.log('Releases fetch error');
71
75
  process.exit(1);
72
76
  }
73
- return res.data;
77
+ return res.data.map((release: any) => {
78
+ return {
79
+ ...release,
80
+ tag_name: release.tag_name.replace(/^v/, ''),
81
+ };
82
+ });
74
83
  };
@@ -2,21 +2,34 @@ import path from 'node:path';
2
2
  import fs from 'fs-extra';
3
3
 
4
4
  import {globalCacheDir} from '../../mops.js';
5
- import {downloadAndExtract} from './toolchain-utils.js';
5
+ import * as toolchainUtils from './toolchain-utils.js';
6
6
 
7
7
  let cacheDir = path.join(globalCacheDir, 'wasmtime');
8
8
 
9
+ export let repo = 'bytecodealliance/wasmtime';
10
+
11
+ export let getLatestReleaseTag = async () => {
12
+ return toolchainUtils.getLatestReleaseTag(repo);
13
+ };
14
+
15
+ export let getReleases = async () => {
16
+ return toolchainUtils.getReleases(repo);
17
+ };
18
+
9
19
  export let isCached = (version: string) => {
10
20
  let dir = path.join(cacheDir, version);
11
21
  return fs.existsSync(dir) && fs.existsSync(path.join(dir, 'wasmtime'));
12
22
  };
13
23
 
14
- export let download = async (version: string, {silent = false} = {}) => {
24
+ export let download = async (version: string, {silent = false, verbose = false} = {}) => {
15
25
  if (!version) {
16
26
  console.error('version is not defined');
17
27
  process.exit(1);
18
28
  }
19
29
  if (isCached(version)) {
30
+ if (verbose) {
31
+ console.log(`wasmtime ${version} is already installed`);
32
+ }
20
33
  return;
21
34
  }
22
35
 
@@ -24,7 +37,9 @@ export let download = async (version: string, {silent = false} = {}) => {
24
37
  let arch = process.arch.startsWith('arm') ? 'aarch64' : 'x86_64';
25
38
  let url = `https://github.com/bytecodealliance/wasmtime/releases/download/v${version}/wasmtime-v${version}-${arch}-${platfrom}.tar.xz`;
26
39
 
27
- silent || console.log(`Downloading ${url}`);
40
+ if (verbose && !silent) {
41
+ console.log(`Downloading ${url}`);
42
+ }
28
43
 
29
- await downloadAndExtract(url, path.join(cacheDir, version));
44
+ await toolchainUtils.downloadAndExtract(url, path.join(cacheDir, version));
30
45
  };
package/dist/bin/mops.js CHANGED
File without changes
package/dist/cache.js CHANGED
@@ -32,7 +32,7 @@ export let copyCache = (pkgId, dest) => {
32
32
  });
33
33
  };
34
34
  export let cacheSize = async () => {
35
- let dir = path.join(globalCacheDir, 'packages');
35
+ let dir = path.join(globalCacheDir);
36
36
  fs.mkdirSync(dir, { recursive: true });
37
37
  let size = await getFolderSize.strict(dir);
38
38
  if (size < 1024 * 1024) {
@@ -41,6 +41,6 @@ export let cacheSize = async () => {
41
41
  return (size / 1024 / 1024).toFixed(2) + ' MB';
42
42
  };
43
43
  export let cleanCache = async () => {
44
- let dir = path.join(globalCacheDir, 'packages');
44
+ let dir = path.join(globalCacheDir);
45
45
  fs.rmSync(dir, { recursive: true, force: true });
46
46
  };
package/dist/cli.js CHANGED
@@ -84,6 +84,7 @@ program
84
84
  if (!compatible) {
85
85
  return;
86
86
  }
87
+ await toolchain.ensureToolchainInited({ strict: false });
87
88
  if (pkg) {
88
89
  // @deprecated
89
90
  console.log(chalk.yellow('Consider using the \'mops add\' command to install a specific package.'));
@@ -91,6 +92,7 @@ program
91
92
  }
92
93
  else {
93
94
  await installAll(options);
95
+ await toolchain.installAll(options);
94
96
  }
95
97
  });
96
98
  // publish
@@ -144,6 +146,7 @@ program
144
146
  process.exit(1);
145
147
  }
146
148
  await installAll({ silent: true, lock: 'ignore' });
149
+ await toolchain.ensureToolchainInited({ strict: false });
147
150
  let sourcesArr = await sources(options);
148
151
  console.log(sourcesArr.join('\n'));
149
152
  });
@@ -297,28 +300,43 @@ toolchainCommand
297
300
  .command('init')
298
301
  .description('One-time initialization of toolchain management')
299
302
  .action(async () => {
300
- toolchain.init();
303
+ await toolchain.init();
301
304
  });
302
305
  toolchainCommand
303
306
  .command('reset')
304
307
  .description('Uninstall toolchain management')
305
308
  .action(async () => {
306
- toolchain.init({ reset: true });
309
+ await toolchain.init({ reset: true });
307
310
  });
308
311
  toolchainCommand
309
312
  .command('use')
310
313
  .description('Install specified tool version and update mops.toml')
311
314
  .addArgument(new Argument('<tool>').choices(['moc', 'wasmtime', 'pocket-ic']))
312
- .addArgument(new Argument('<version>'))
315
+ .addArgument(new Argument('[version]'))
313
316
  .action(async (tool, version) => {
314
- toolchain.use(tool, version);
317
+ if (!checkConfigFile()) {
318
+ process.exit(1);
319
+ }
320
+ await toolchain.use(tool, version);
321
+ });
322
+ toolchainCommand
323
+ .command('update')
324
+ .description('Update specified tool or all tools to the latest version and update mops.toml')
325
+ .addArgument(new Argument('[tool]').choices(['moc', 'wasmtime', 'pocket-ic']))
326
+ .action(async (tool) => {
327
+ if (!checkConfigFile()) {
328
+ process.exit(1);
329
+ }
330
+ await toolchain.update(tool);
315
331
  });
316
332
  toolchainCommand
317
333
  .command('bin')
318
334
  .description('Get path to the tool binary\n<tool> can be one of "moc", "wasmtime", "pocket-ic"')
319
335
  .addArgument(new Argument('<tool>').choices(['moc', 'wasmtime', 'pocket-ic']))
320
- .action(async (tool) => {
321
- toolchain.bin(tool);
336
+ .addOption(new Option('--fallback', 'Fallback to the moc that comes with dfx if moc is not specified in the [toolchain] section'))
337
+ .action(async (tool, options) => {
338
+ let bin = await toolchain.bin(tool, options);
339
+ console.log(bin);
322
340
  });
323
341
  program.addCommand(toolchainCommand);
324
342
  program.parse();
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import chalk from 'chalk';
3
- import logUpdate from 'log-update';
3
+ import { createLogUpdate } from 'log-update';
4
4
  import { checkConfigFile, getGithubCommit, parseGithubURL, readConfig, writeConfig } from '../mops.js';
5
5
  import { getHighestVersion } from '../api/getHighestVersion.js';
6
6
  import { installFromGithub } from '../vessel.js';
@@ -91,6 +91,7 @@ export async function add(name, { verbose = false, dev = false, lock } = {}, asN
91
91
  throw Error(`Invalid config file: [${depsProp}] not found`);
92
92
  }
93
93
  writeConfig(config);
94
+ let logUpdate = createLogUpdate(process.stdout, { showCursor: true });
94
95
  if (lock !== 'ignore') {
95
96
  logUpdate('Checking integrity...');
96
97
  }
@@ -1,4 +1,4 @@
1
- import { PocketIc } from '@hadronous/pic';
1
+ import { PocketIc } from 'pic-ic';
2
2
  export declare class BenchReplica {
3
3
  type: 'dfx' | 'pocket-ic';
4
4
  verbose: boolean;