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
@@ -1,452 +1,543 @@
1
- import process from 'node:process';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import chalk from 'chalk';
5
- import logUpdate from 'log-update';
6
- import {globbySync} from 'globby';
7
- import {minimatch} from 'minimatch';
8
- import prompts from 'prompts';
9
-
10
- import {checkConfigFile, getIdentity, getRootDir, progressBar, readConfig} from '../mops.js';
11
- import {mainActor} from '../api/actors.js';
12
- import {parallel} from '../parallel.js';
13
- import {docs} from './docs.js';
14
- import {Benchmarks, DependencyV2, PackageConfigV3_Publishing, Requirement} from '../declarations/main/main.did.js';
15
- import {Dependency} from '../types.js';
16
- import {testWithReporter} from './test/test.js';
17
- import {SilentReporter} from './test/reporters/silent-reporter.js';
18
- import {findChangelogEntry} from '../helpers/find-changelog-entry.js';
19
- import {bench} from './bench.js';
20
- import {docsCoverage} from './docs-coverage.js';
21
-
22
- export async function publish(options : {docs ?: boolean, test ?: boolean, bench ?: boolean, verbose ?: boolean} = {}) {
23
- if (!checkConfigFile()) {
24
- return;
25
- }
26
-
27
- let rootDir = getRootDir();
28
- let config = readConfig();
29
-
30
- console.log(`Publishing ${config.package?.name}@${config.package?.version}`);
31
-
32
- // validate
33
- for (let key of Object.keys(config)) {
34
- if (!['package', 'dependencies', 'dev-dependencies', 'toolchain', 'requirements'].includes(key)) {
35
- console.log(chalk.red('Error: ') + `Unknown config section [${key}]`);
36
- process.exit(1);
37
- }
38
- }
39
-
40
- // required fields
41
- if (!config.package) {
42
- console.log(chalk.red('Error: ') + 'Please specify [package] section in your mops.toml');
43
- process.exit(1);
44
- }
45
- for (let key of ['name', 'version']) {
46
- // @ts-ignore
47
- if (!config.package[key]) {
48
- console.log(chalk.red('Error: ') + `Please specify "${key}" in [package] section in your mops.toml`);
49
- process.exit(1);
50
- }
51
- }
52
-
53
- // desired fields
54
- for (let key of ['description', 'repository']) {
55
- // @ts-ignore
56
- if (!config.package[key] && !process.env.CI) {
57
- let res = await prompts({
58
- type: 'confirm',
59
- name: 'ok',
60
- message: `Missing recommended config key "${key}", publish anyway?`,
61
- });
62
- if (!res.ok) {
63
- return;
64
- }
65
- }
66
- }
67
-
68
- let packageKeys = [
69
- 'name',
70
- 'version',
71
- 'keywords',
72
- 'description',
73
- 'repository',
74
- 'documentation',
75
- 'homepage',
76
- 'baseDir',
77
- 'readme',
78
- 'license',
79
- 'files',
80
- 'dfx',
81
- 'moc',
82
- 'donation',
83
- ];
84
- for (let key of Object.keys(config.package)) {
85
- if (!packageKeys.includes(key)) {
86
- console.log(chalk.red('Error: ') + `Unknown config key 'package.${key}'`);
87
- process.exit(1);
88
- }
89
- }
90
-
91
- // check lengths
92
- let keysMax = {
93
- name: 50,
94
- version: 20,
95
- keywords: 10,
96
- description: 200,
97
- repository: 300,
98
- documentation: 300,
99
- homepage: 300,
100
- readme: 100,
101
- license: 30,
102
- files: 20,
103
- dfx: 10,
104
- moc: 10,
105
- donation: 64,
106
- root: 50,
107
- };
108
-
109
- for (let [key, max] of Object.entries(keysMax)) {
110
- // @ts-ignore
111
- if (config.package[key] && config.package[key].length > max) {
112
- console.log(chalk.red('Error: ') + `package.${key} value max length is ${max}`);
113
- process.exit(1);
114
- }
115
- }
116
-
117
- if (config.dependencies) {
118
- if (Object.keys(config.dependencies).length > 100) {
119
- console.log(chalk.red('Error: ') + 'max dependencies is 100');
120
- process.exit(1);
121
- }
122
-
123
- for (let dep of Object.values(config.dependencies)) {
124
- if (dep.path) {
125
- console.log(chalk.red('Error: ') + 'you can\'t publish packages with local dependencies');
126
- process.exit(1);
127
- }
128
- delete dep.path;
129
- }
130
-
131
- for (let dep of Object.values(config.dependencies)) {
132
- if (dep.repo && !process.env.CI) {
133
- let res = await prompts({
134
- type: 'confirm',
135
- name: 'ok',
136
- message: chalk.yellow('GitHub dependencies make the registry less reliable and limit its capabilities.\nIf you are the owner of the dependency, please consider publishing it to the Mops registry.') + '\n\nPublish anyway?',
137
- });
138
- if (!res.ok) {
139
- return;
140
- }
141
- }
142
- }
143
- }
144
-
145
- if (config['dev-dependencies']) {
146
- if (Object.keys(config['dev-dependencies']).length > 100) {
147
- console.log(chalk.red('Error: ') + 'max dev-dependencies is 100');
148
- process.exit(1);
149
- }
150
-
151
- for (let dep of Object.values(config['dev-dependencies'])) {
152
- if (dep.path) {
153
- console.log(chalk.red('Error: ') + 'you can\'t publish packages with local dev-dependencies');
154
- process.exit(1);
155
- }
156
- delete dep.path;
157
- }
158
- }
159
-
160
- if (config.package.keywords) {
161
- for (let keyword of config.package.keywords) {
162
- if (keyword.length > 20) {
163
- console.log(chalk.red('Error: ') + 'max keyword length is 20');
164
- return;
165
- }
166
- }
167
- }
168
-
169
- if (config.package.files) {
170
- for (let file of config.package.files) {
171
- if (file.startsWith('/') || file.startsWith('../')) {
172
- console.log(chalk.red('Error: ') + 'file path cannot start with \'/\' or \'../\'');
173
- return;
174
- }
175
- }
176
- }
177
-
178
- if (config.requirements) {
179
- Object.keys(config.requirements).forEach((name) => {
180
- if (name !== 'moc') {
181
- console.log(chalk.red('Error: ') + `Unknown requirement "${name}"`);
182
- return;
183
- }
184
- });
185
- }
186
-
187
- let toBackendDep = (dep : Dependency) : DependencyV2 => {
188
- return {
189
- ...dep,
190
- version: dep.version || '',
191
- repo: dep.repo || '',
192
- };
193
- };
194
-
195
- let toBackendReq = ([name, value] : [string, string]) : Requirement => {
196
- return {name, value};
197
- };
198
-
199
- // map fields
200
- let backendPkgConfig : PackageConfigV3_Publishing = {
201
- name: config.package.name,
202
- version: config.package.version,
203
- keywords: config.package.keywords || [],
204
- description: config.package.description || '',
205
- repository: config.package.repository || '',
206
- homepage: config.package.homepage || '',
207
- documentation: config.package.documentation || '',
208
- baseDir: 'src',
209
- readme: 'README.md',
210
- license: config.package.license || '',
211
- dfx: config.package.dfx || '',
212
- moc: config.package.moc || '',
213
- donation: config.package.donation || '',
214
- dependencies: Object.values(config.dependencies || {}).map(toBackendDep),
215
- devDependencies: Object.values(config['dev-dependencies'] || {}).map(toBackendDep),
216
- scripts: [],
217
- requirements: [Object.entries(config.requirements || {}).map((req) => toBackendReq(req))],
218
- };
219
-
220
- let defaultFiles = [
221
- 'mops.toml',
222
- 'README.md',
223
- 'LICENSE',
224
- 'NOTICE',
225
- '!.mops/**',
226
- '!test/**',
227
- '!tests/**',
228
- '!**/*.test.mo',
229
- '!**/*.Test.mo',
230
- '!bench/**',
231
- '!benchmark/**',
232
- '!**/*.bench.mo',
233
- '!**/*.Bench.mo',
234
- '!**/node_modules/**',
235
- ];
236
- let files = config.package.files || ['**/*.mo'];
237
- files = [...files, ...defaultFiles];
238
- files = globbySync([...files, ...defaultFiles]);
239
-
240
- if (options.verbose) {
241
- console.log('Files:');
242
- console.log(files.map((file) => ' ' + file).join('\n'));
243
- }
244
-
245
- // generate docs
246
- let docsFile = path.join(rootDir, '.mops/.docs/docs.tgz');
247
- let docsCov = 0;
248
- if (options.docs) {
249
- console.log('Generating documentation...');
250
- docsCov = await docsCoverage({
251
- reporter: 'silent',
252
- });
253
- await docs({silent: true, archive: true});
254
- if (fs.existsSync(docsFile)) {
255
- files.unshift(docsFile);
256
- }
257
- }
258
-
259
- // check required files
260
- if (!files.includes('mops.toml')) {
261
- console.log(chalk.red('Error: ') + ' please add mops.toml file');
262
- process.exit(1);
263
- }
264
- if (!files.includes('README.md')) {
265
- console.log(chalk.red('Error: ') + ' please add README.md file');
266
- process.exit(1);
267
- }
268
-
269
- // check allowed exts
270
- for (let file of files) {
271
- if (!minimatch(file, '**/*.{mo,did,md,toml}') && !file.toLowerCase().endsWith('license') && !file.toLowerCase().endsWith('notice') && file !== docsFile) {
272
- console.log(chalk.red('Error: ') + `file ${file} has unsupported extension. Allowed: .mo, .did, .md, .toml`);
273
- process.exit(1);
274
- }
275
- }
276
-
277
- // parse changelog
278
- console.log('Parsing CHANGELOG.md...');
279
- let changelog = parseChangelog(config.package.version);
280
- if (!changelog && config.package.repository) {
281
- console.log('Fetching release notes from GitHub...');
282
- changelog = await fetchGitHubReleaseNotes(config.package.repository, config.package.version);
283
- }
284
- if (changelog) {
285
- console.log('Changelog:');
286
- console.log(chalk.gray(changelog));
287
- }
288
-
289
- // test
290
- let reporter = new SilentReporter;
291
- if (options.test) {
292
- console.log('Running tests...');
293
- await testWithReporter(reporter, '', 'interpreter', config.toolchain?.['pocket-ic'] ? 'pocket-ic' : 'dfx');
294
- if (reporter.failed > 0) {
295
- console.log(chalk.red('Error: ') + 'tests failed');
296
- process.exit(1);
297
- }
298
- }
299
-
300
- // bench
301
- let benchmarks : Benchmarks = [];
302
- if (options.bench) {
303
- console.log('Running benchmarks...');
304
- try {
305
- benchmarks = await bench('', {
306
- replica: config.toolchain?.['pocket-ic'] ? 'pocket-ic' : 'dfx',
307
- gc: 'copying',
308
- forceGc: true,
309
- silent: true,
310
- });
311
- }
312
- catch (err) {
313
- console.error(err);
314
- console.log(chalk.red('Error: ') + 'benchmarks failed');
315
- process.exit(1);
316
- }
317
- }
318
-
319
- // progress
320
- let total = files.length + 2;
321
- let step = 0;
322
- function progress() {
323
- step++;
324
- logUpdate(`Uploading files ${progressBar(step, total)}`);
325
- }
326
-
327
- // upload config
328
- let identity = await getIdentity();
329
- let actor = await mainActor(identity);
330
-
331
- progress();
332
- let publishing = await actor.startPublish(backendPkgConfig);
333
- if ('err' in publishing) {
334
- console.log(chalk.red('Error: ') + publishing.err);
335
- process.exit(1);
336
- }
337
- let puiblishingId = publishing.ok;
338
-
339
- // upload test stats
340
- if (options.test) {
341
- await actor.uploadTestStats(puiblishingId, {
342
- passed: BigInt(reporter.passed),
343
- passedNames: reporter.passedNamesFlat,
344
- });
345
- }
346
-
347
- // upload benchmarks
348
- if (options.bench) {
349
- await actor.uploadBenchmarks(puiblishingId, benchmarks);
350
- }
351
-
352
- // upload changelog
353
- if (changelog) {
354
- await actor.uploadNotes(puiblishingId, changelog);
355
- }
356
-
357
- // upload docs coverage
358
- if (options.docs) {
359
- await actor.uploadDocsCoverage(puiblishingId, docsCov);
360
- }
361
-
362
- // upload files
363
- await parallel(8, files, async (file : string) => {
364
- progress();
365
-
366
- let chunkSize = 1024 * 1024 + 512 * 1024; // 1.5mb
367
- let content = fs.readFileSync(file);
368
- let chunkCount = Math.ceil(content.length / chunkSize);
369
- let firstChunk = Array.from(content.slice(0, chunkSize));
370
-
371
- // remove path from docs file
372
- if (file === docsFile) {
373
- file = path.basename(file);
374
- }
375
-
376
- let res = await actor.startFileUpload(puiblishingId, file, BigInt(chunkCount), firstChunk);
377
- if ('err' in res) {
378
- console.log(chalk.red('Error: ') + res.err);
379
- process.exit(1);
380
- }
381
- let fileId = res.ok;
382
-
383
- for (let i = 1; i < chunkCount; i++) {
384
- let start = i * chunkSize;
385
- let chunk = Array.from(content.slice(start, start + chunkSize));
386
- let res = await actor.uploadFileChunk(puiblishingId, fileId, BigInt(i), chunk);
387
- if ('err' in res) {
388
- console.log(chalk.red('Error: ') + res.err);
389
- process.exit(1);
390
- }
391
- }
392
- });
393
-
394
- fs.rmSync(path.join(rootDir, '.mops/.docs'), {force: true, recursive: true});
395
-
396
- // finish
397
- progress();
398
- logUpdate.done();
399
-
400
- let res = await actor.finishPublish(puiblishingId);
401
- if ('err' in res) {
402
- console.log(chalk.red('Error: ') + res.err);
403
- process.exit(1);
404
- }
405
-
406
- console.log(chalk.green('Published ') + `${config.package.name}@${config.package.version}`);
1
+ import process from "node:process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import chalk from "chalk";
5
+ import logUpdate from "log-update";
6
+ import { globbySync } from "globby";
7
+ import { minimatch } from "minimatch";
8
+ import prompts from "prompts";
9
+
10
+ import {
11
+ checkConfigFile,
12
+ getIdentity,
13
+ getRootDir,
14
+ progressBar,
15
+ readConfig,
16
+ } from "../mops.js";
17
+ import { mainActor } from "../api/actors.js";
18
+ import { parallel } from "../parallel.js";
19
+ import { docs } from "./docs.js";
20
+ import {
21
+ Benchmarks,
22
+ DependencyV2,
23
+ PackageConfigV3_Publishing,
24
+ Requirement,
25
+ } from "../declarations/main/main.did.js";
26
+ import { Dependency } from "../types.js";
27
+ import { testWithReporter } from "./test/test.js";
28
+ import { SilentReporter } from "./test/reporters/silent-reporter.js";
29
+ import { findChangelogEntry } from "../helpers/find-changelog-entry.js";
30
+ import { bench } from "./bench.js";
31
+ import { docsCoverage } from "./docs-coverage.js";
32
+
33
+ export async function publish(
34
+ options: {
35
+ docs?: boolean;
36
+ test?: boolean;
37
+ bench?: boolean;
38
+ verbose?: boolean;
39
+ } = {},
40
+ ) {
41
+ if (!checkConfigFile()) {
42
+ return;
43
+ }
44
+
45
+ let rootDir = getRootDir();
46
+ let config = readConfig();
47
+
48
+ console.log(`Publishing ${config.package?.name}@${config.package?.version}`);
49
+
50
+ // validate
51
+ for (let key of Object.keys(config)) {
52
+ if (
53
+ ![
54
+ "package",
55
+ "dependencies",
56
+ "dev-dependencies",
57
+ "toolchain",
58
+ "requirements",
59
+ ].includes(key)
60
+ ) {
61
+ console.log(chalk.red("Error: ") + `Unknown config section [${key}]`);
62
+ process.exit(1);
63
+ }
64
+ }
65
+
66
+ // required fields
67
+ if (!config.package) {
68
+ console.log(
69
+ chalk.red("Error: ") +
70
+ "Please specify [package] section in your mops.toml",
71
+ );
72
+ process.exit(1);
73
+ }
74
+ for (let key of ["name", "version"]) {
75
+ // @ts-ignore
76
+ if (!config.package[key]) {
77
+ console.log(
78
+ chalk.red("Error: ") +
79
+ `Please specify "${key}" in [package] section in your mops.toml`,
80
+ );
81
+ process.exit(1);
82
+ }
83
+ }
84
+
85
+ // desired fields
86
+ for (let key of ["description", "repository"]) {
87
+ // @ts-ignore
88
+ if (!config.package[key] && !process.env.CI) {
89
+ let res = await prompts({
90
+ type: "confirm",
91
+ name: "ok",
92
+ message: `Missing recommended config key "${key}", publish anyway?`,
93
+ });
94
+ if (!res.ok) {
95
+ return;
96
+ }
97
+ }
98
+ }
99
+
100
+ let packageKeys = [
101
+ "name",
102
+ "version",
103
+ "keywords",
104
+ "description",
105
+ "repository",
106
+ "documentation",
107
+ "homepage",
108
+ "baseDir",
109
+ "readme",
110
+ "license",
111
+ "files",
112
+ "dfx",
113
+ "moc",
114
+ "donation",
115
+ ];
116
+ for (let key of Object.keys(config.package)) {
117
+ if (!packageKeys.includes(key)) {
118
+ console.log(chalk.red("Error: ") + `Unknown config key 'package.${key}'`);
119
+ process.exit(1);
120
+ }
121
+ }
122
+
123
+ // check lengths
124
+ let keysMax = {
125
+ name: 50,
126
+ version: 20,
127
+ keywords: 10,
128
+ description: 200,
129
+ repository: 300,
130
+ documentation: 300,
131
+ homepage: 300,
132
+ readme: 100,
133
+ license: 30,
134
+ files: 20,
135
+ dfx: 10,
136
+ moc: 10,
137
+ donation: 64,
138
+ root: 50,
139
+ };
140
+
141
+ for (let [key, max] of Object.entries(keysMax)) {
142
+ // @ts-ignore
143
+ if (config.package[key] && config.package[key].length > max) {
144
+ console.log(
145
+ chalk.red("Error: ") + `package.${key} value max length is ${max}`,
146
+ );
147
+ process.exit(1);
148
+ }
149
+ }
150
+
151
+ if (config.dependencies) {
152
+ if (Object.keys(config.dependencies).length > 100) {
153
+ console.log(chalk.red("Error: ") + "max dependencies is 100");
154
+ process.exit(1);
155
+ }
156
+
157
+ for (let dep of Object.values(config.dependencies)) {
158
+ if (dep.path) {
159
+ console.log(
160
+ chalk.red("Error: ") +
161
+ "you can't publish packages with local dependencies",
162
+ );
163
+ process.exit(1);
164
+ }
165
+ delete dep.path;
166
+ }
167
+
168
+ for (let dep of Object.values(config.dependencies)) {
169
+ if (dep.repo && !process.env.CI) {
170
+ let res = await prompts({
171
+ type: "confirm",
172
+ name: "ok",
173
+ message:
174
+ chalk.yellow(
175
+ "GitHub dependencies make the registry less reliable and limit its capabilities.\nIf you are the owner of the dependency, please consider publishing it to the Mops registry.",
176
+ ) + "\n\nPublish anyway?",
177
+ });
178
+ if (!res.ok) {
179
+ return;
180
+ }
181
+ }
182
+ }
183
+ }
184
+
185
+ if (config["dev-dependencies"]) {
186
+ if (Object.keys(config["dev-dependencies"]).length > 100) {
187
+ console.log(chalk.red("Error: ") + "max dev-dependencies is 100");
188
+ process.exit(1);
189
+ }
190
+
191
+ for (let dep of Object.values(config["dev-dependencies"])) {
192
+ if (dep.path) {
193
+ console.log(
194
+ chalk.red("Error: ") +
195
+ "you can't publish packages with local dev-dependencies",
196
+ );
197
+ process.exit(1);
198
+ }
199
+ delete dep.path;
200
+ }
201
+ }
202
+
203
+ if (config.package.keywords) {
204
+ for (let keyword of config.package.keywords) {
205
+ if (keyword.length > 20) {
206
+ console.log(chalk.red("Error: ") + "max keyword length is 20");
207
+ return;
208
+ }
209
+ }
210
+ }
211
+
212
+ if (config.package.files) {
213
+ for (let file of config.package.files) {
214
+ if (file.startsWith("/") || file.startsWith("../")) {
215
+ console.log(
216
+ chalk.red("Error: ") + "file path cannot start with '/' or '../'",
217
+ );
218
+ return;
219
+ }
220
+ }
221
+ }
222
+
223
+ if (config.requirements) {
224
+ Object.keys(config.requirements).forEach((name) => {
225
+ if (name !== "moc") {
226
+ console.log(chalk.red("Error: ") + `Unknown requirement "${name}"`);
227
+ return;
228
+ }
229
+ });
230
+ }
231
+
232
+ let toBackendDep = (dep: Dependency): DependencyV2 => {
233
+ return {
234
+ ...dep,
235
+ version: dep.version || "",
236
+ repo: dep.repo || "",
237
+ };
238
+ };
239
+
240
+ let toBackendReq = ([name, value]: [string, string]): Requirement => {
241
+ return { name, value };
242
+ };
243
+
244
+ // map fields
245
+ let backendPkgConfig: PackageConfigV3_Publishing = {
246
+ name: config.package.name,
247
+ version: config.package.version,
248
+ keywords: config.package.keywords || [],
249
+ description: config.package.description || "",
250
+ repository: config.package.repository || "",
251
+ homepage: config.package.homepage || "",
252
+ documentation: config.package.documentation || "",
253
+ baseDir: "src",
254
+ readme: "README.md",
255
+ license: config.package.license || "",
256
+ dfx: config.package.dfx || "",
257
+ moc: config.package.moc || "",
258
+ donation: config.package.donation || "",
259
+ dependencies: Object.values(config.dependencies || {}).map(toBackendDep),
260
+ devDependencies: Object.values(config["dev-dependencies"] || {}).map(
261
+ toBackendDep,
262
+ ),
263
+ scripts: [],
264
+ requirements: [
265
+ Object.entries(config.requirements || {}).map((req) => toBackendReq(req)),
266
+ ],
267
+ };
268
+
269
+ let defaultFiles = [
270
+ "mops.toml",
271
+ "README.md",
272
+ "LICENSE",
273
+ "NOTICE",
274
+ "!.mops/**",
275
+ "!test/**",
276
+ "!tests/**",
277
+ "!**/*.test.mo",
278
+ "!**/*.Test.mo",
279
+ "!bench/**",
280
+ "!benchmark/**",
281
+ "!**/*.bench.mo",
282
+ "!**/*.Bench.mo",
283
+ "!**/node_modules/**",
284
+ ];
285
+ let files = config.package.files || ["**/*.mo"];
286
+ files = [...files, ...defaultFiles];
287
+ files = globbySync([...files, ...defaultFiles]);
288
+
289
+ if (options.verbose) {
290
+ console.log("Files:");
291
+ console.log(files.map((file) => " " + file).join("\n"));
292
+ }
293
+
294
+ // generate docs
295
+ let docsFile = path.join(rootDir, ".mops/.docs/docs.tgz");
296
+ let docsCov = 0;
297
+ if (options.docs) {
298
+ console.log("Generating documentation...");
299
+ docsCov = await docsCoverage({
300
+ reporter: "silent",
301
+ });
302
+ await docs({ silent: true, archive: true });
303
+ if (fs.existsSync(docsFile)) {
304
+ files.unshift(docsFile);
305
+ }
306
+ }
307
+
308
+ // check required files
309
+ if (!files.includes("mops.toml")) {
310
+ console.log(chalk.red("Error: ") + " please add mops.toml file");
311
+ process.exit(1);
312
+ }
313
+ if (!files.includes("README.md")) {
314
+ console.log(chalk.red("Error: ") + " please add README.md file");
315
+ process.exit(1);
316
+ }
317
+
318
+ // check allowed exts
319
+ for (let file of files) {
320
+ if (
321
+ !minimatch(file, "**/*.{mo,did,md,toml}") &&
322
+ !file.toLowerCase().endsWith("license") &&
323
+ !file.toLowerCase().endsWith("notice") &&
324
+ file !== docsFile
325
+ ) {
326
+ console.log(
327
+ chalk.red("Error: ") +
328
+ `file ${file} has unsupported extension. Allowed: .mo, .did, .md, .toml`,
329
+ );
330
+ process.exit(1);
331
+ }
332
+ }
333
+
334
+ // parse changelog
335
+ console.log("Parsing CHANGELOG.md...");
336
+ let changelog = parseChangelog(config.package.version);
337
+ if (!changelog && config.package.repository) {
338
+ console.log("Fetching release notes from GitHub...");
339
+ changelog = await fetchGitHubReleaseNotes(
340
+ config.package.repository,
341
+ config.package.version,
342
+ );
343
+ }
344
+ if (changelog) {
345
+ console.log("Changelog:");
346
+ console.log(chalk.gray(changelog));
347
+ }
348
+
349
+ // test
350
+ let reporter = new SilentReporter();
351
+ if (options.test) {
352
+ console.log("Running tests...");
353
+ await testWithReporter(
354
+ reporter,
355
+ "",
356
+ "interpreter",
357
+ config.toolchain?.["pocket-ic"] ? "pocket-ic" : "dfx",
358
+ );
359
+ if (reporter.failed > 0) {
360
+ console.log(chalk.red("Error: ") + "tests failed");
361
+ process.exit(1);
362
+ }
363
+ }
364
+
365
+ // bench
366
+ let benchmarks: Benchmarks = [];
367
+ if (options.bench) {
368
+ console.log("Running benchmarks...");
369
+ try {
370
+ benchmarks = await bench("", {
371
+ replica: config.toolchain?.["pocket-ic"] ? "pocket-ic" : "dfx",
372
+ gc: "copying",
373
+ forceGc: true,
374
+ silent: true,
375
+ });
376
+ } catch (err) {
377
+ console.error(err);
378
+ console.log(chalk.red("Error: ") + "benchmarks failed");
379
+ process.exit(1);
380
+ }
381
+ }
382
+
383
+ // progress
384
+ let total = files.length + 2;
385
+ let step = 0;
386
+ function progress() {
387
+ step++;
388
+ logUpdate(`Uploading files ${progressBar(step, total)}`);
389
+ }
390
+
391
+ // upload config
392
+ let identity = await getIdentity();
393
+ let actor = await mainActor(identity);
394
+
395
+ progress();
396
+ let publishing = await actor.startPublish(backendPkgConfig);
397
+ if ("err" in publishing) {
398
+ console.log(chalk.red("Error: ") + publishing.err);
399
+ process.exit(1);
400
+ }
401
+ let puiblishingId = publishing.ok;
402
+
403
+ // upload test stats
404
+ if (options.test) {
405
+ await actor.uploadTestStats(puiblishingId, {
406
+ passed: BigInt(reporter.passed),
407
+ passedNames: reporter.passedNamesFlat,
408
+ });
409
+ }
410
+
411
+ // upload benchmarks
412
+ if (options.bench) {
413
+ await actor.uploadBenchmarks(puiblishingId, benchmarks);
414
+ }
415
+
416
+ // upload changelog
417
+ if (changelog) {
418
+ await actor.uploadNotes(puiblishingId, changelog);
419
+ }
420
+
421
+ // upload docs coverage
422
+ if (options.docs) {
423
+ await actor.uploadDocsCoverage(puiblishingId, docsCov);
424
+ }
425
+
426
+ // upload files
427
+ await parallel(8, files, async (file: string) => {
428
+ progress();
429
+
430
+ let chunkSize = 1024 * 1024 + 512 * 1024; // 1.5mb
431
+ let content = fs.readFileSync(file);
432
+ let chunkCount = Math.ceil(content.length / chunkSize);
433
+ let firstChunk = Array.from(content.slice(0, chunkSize));
434
+
435
+ // remove path from docs file
436
+ if (file === docsFile) {
437
+ file = path.basename(file);
438
+ }
439
+
440
+ let res = await actor.startFileUpload(
441
+ puiblishingId,
442
+ file,
443
+ BigInt(chunkCount),
444
+ firstChunk,
445
+ );
446
+ if ("err" in res) {
447
+ console.log(chalk.red("Error: ") + res.err);
448
+ process.exit(1);
449
+ }
450
+ let fileId = res.ok;
451
+
452
+ for (let i = 1; i < chunkCount; i++) {
453
+ let start = i * chunkSize;
454
+ let chunk = Array.from(content.slice(start, start + chunkSize));
455
+ let res = await actor.uploadFileChunk(
456
+ puiblishingId,
457
+ fileId,
458
+ BigInt(i),
459
+ chunk,
460
+ );
461
+ if ("err" in res) {
462
+ console.log(chalk.red("Error: ") + res.err);
463
+ process.exit(1);
464
+ }
465
+ }
466
+ });
467
+
468
+ fs.rmSync(path.join(rootDir, ".mops/.docs"), {
469
+ force: true,
470
+ recursive: true,
471
+ });
472
+
473
+ // finish
474
+ progress();
475
+ logUpdate.done();
476
+
477
+ let res = await actor.finishPublish(puiblishingId);
478
+ if ("err" in res) {
479
+ console.log(chalk.red("Error: ") + res.err);
480
+ process.exit(1);
481
+ }
482
+
483
+ console.log(
484
+ chalk.green("Published ") +
485
+ `${config.package.name}@${config.package.version}`,
486
+ );
407
487
  }
408
488
 
409
- function parseChangelog(version : string) : string {
410
- let rootDir = getRootDir();
411
- let changelogFile = '';
489
+ function parseChangelog(version: string): string {
490
+ let rootDir = getRootDir();
491
+ let changelogFile = "";
412
492
 
413
- let files = ['CHANGELOG.md', 'Changelog.md', 'changelog.md'];
493
+ let files = ["CHANGELOG.md", "Changelog.md", "changelog.md"];
414
494
 
415
- for (let file of files) {
416
- if (fs.existsSync(path.join(rootDir, file))) {
417
- changelogFile = path.join(rootDir, file);
418
- break;
419
- }
420
- }
421
- if (!changelogFile) {
422
- console.log(chalk.yellow('CHANGELOG.md not found'));
423
- return '';
424
- }
495
+ for (let file of files) {
496
+ if (fs.existsSync(path.join(rootDir, file))) {
497
+ changelogFile = path.join(rootDir, file);
498
+ break;
499
+ }
500
+ }
501
+ if (!changelogFile) {
502
+ console.log(chalk.yellow("CHANGELOG.md not found"));
503
+ return "";
504
+ }
425
505
 
426
- let str = fs.readFileSync(changelogFile, 'utf-8');
427
- let changelog = findChangelogEntry(str, version);
506
+ let str = fs.readFileSync(changelogFile, "utf-8");
507
+ let changelog = findChangelogEntry(str, version);
428
508
 
429
- if (!changelog) {
430
- console.log(chalk.yellow('No changelog entry found'));
431
- }
509
+ if (!changelog) {
510
+ console.log(chalk.yellow("No changelog entry found"));
511
+ }
432
512
 
433
- return changelog || '';
513
+ return changelog || "";
434
514
  }
435
515
 
436
- async function fetchGitHubReleaseNotes(repo : string, version : string) : Promise<string> {
437
- let repoPath = new URL(repo).pathname;
438
- let res = await fetch(`https://api.github.com/repos${repoPath}/releases/tags/${version}`);
439
- let release = await res.json();
440
-
441
- if (release.message === 'Not Found') {
442
- res = await fetch(`https://api.github.com/repos${repoPath}/releases/tags/v${version}`);
443
- release = await res.json();
444
-
445
- if (release.message === 'Not Found') {
446
- console.log(chalk.yellow(`No GitHub release found with name ${version} or v${version}`));
447
- return '';
448
- }
449
- }
450
-
451
- return release.body;
452
- }
516
+ async function fetchGitHubReleaseNotes(
517
+ repo: string,
518
+ version: string,
519
+ ): Promise<string> {
520
+ let repoPath = new URL(repo).pathname;
521
+ let res = await fetch(
522
+ `https://api.github.com/repos${repoPath}/releases/tags/${version}`,
523
+ );
524
+ let release = await res.json();
525
+
526
+ if (release.message === "Not Found") {
527
+ res = await fetch(
528
+ `https://api.github.com/repos${repoPath}/releases/tags/v${version}`,
529
+ );
530
+ release = await res.json();
531
+
532
+ if (release.message === "Not Found") {
533
+ console.log(
534
+ chalk.yellow(
535
+ `No GitHub release found with name ${version} or v${version}`,
536
+ ),
537
+ );
538
+ return "";
539
+ }
540
+ }
541
+
542
+ return release.body;
543
+ }