1 | import spawn from 'cross-spawn';
|
2 | import { getRegistryUrl } from '../../shared/npm';
|
3 | import packageJson from '../../shared/packageJson';
|
4 | import semver from 'semver';
|
5 | import chalk from 'chalk';
|
6 | import inquirer from 'inquirer';
|
7 | import { safeDump } from '../../shared/yaml';
|
8 |
|
9 | async function updateCli(packageManager: string) {
|
10 | return new Promise((resolve, reject) => {
|
11 | const args =
|
12 | packageManager === 'yarn'
|
13 | ? ['global', 'add', '@feflow/cli@latest', '--extract']
|
14 | : [
|
15 | 'install',
|
16 | '@feflow/cli@latest',
|
17 | '--color=always',
|
18 | '--save',
|
19 | '--save-exact',
|
20 | '--loglevel',
|
21 | 'error',
|
22 | '-g'
|
23 | ];
|
24 |
|
25 | const child = spawn(packageManager, args, {
|
26 | stdio: 'inherit',
|
27 | windowsHide: true
|
28 | });
|
29 | child.on('close', code => {
|
30 | if (code !== 0) {
|
31 | reject({
|
32 | command: `${packageManager} ${args.join(' ')}`
|
33 | });
|
34 | return;
|
35 | }
|
36 | resolve();
|
37 | });
|
38 | });
|
39 | }
|
40 |
|
41 | async function checkCliUpdate(ctx: any) {
|
42 | const { version, config, configPath } = ctx;
|
43 | const packageManager = config.packageManager;
|
44 | const registryUrl = await getRegistryUrl(packageManager);
|
45 | const latestVersion: any = await packageJson(
|
46 | '@feflow/cli',
|
47 | registryUrl
|
48 | ).catch(() => {
|
49 | ctx.logger.warn(
|
50 | `Network error, can't reach ${registryUrl}, CLI give up verison check.`
|
51 | );
|
52 | });
|
53 |
|
54 | if (latestVersion && semver.gt(latestVersion, version)) {
|
55 | const askIfUpdateCli = [
|
56 | {
|
57 | type: 'confirm',
|
58 | name: 'ifUpdate',
|
59 | message: `${chalk.yellow(
|
60 | `@feflow/cli's latest version is ${chalk.green(
|
61 | `${latestVersion}`
|
62 | )}, but your version is ${chalk.red(
|
63 | `${version}`
|
64 | )}, Do you want to update it?`
|
65 | )}`,
|
66 | default: true
|
67 | }
|
68 | ];
|
69 | const answer = await inquirer.prompt(askIfUpdateCli);
|
70 | if (answer.ifUpdate) {
|
71 | await updateCli(packageManager);
|
72 | } else {
|
73 | safeDump(
|
74 | {
|
75 | ...config,
|
76 | lastUpdateCheck: +new Date()
|
77 | },
|
78 | configPath
|
79 | );
|
80 | }
|
81 | } else {
|
82 | ctx.logger.info(`Current version is already latest.`);
|
83 | }
|
84 | }
|
85 |
|
86 | module.exports = (ctx: any) => {
|
87 | ctx.commander.register('upgrade', 'upgrade fef cli', () => {
|
88 | checkCliUpdate(ctx);
|
89 | });
|
90 | };
|
91 |
|
92 | module.exports.updateCli = updateCli;
|
93 | module.exports.checkCliUpdate = checkCliUpdate;
|