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
@@ -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
+ }