UNPKG

2.42 kBPlain TextView Raw
1import spawn from 'cross-spawn';
2import { getRegistryUrl } from '../../shared/npm';
3import packageJson from '../../shared/packageJson';
4import semver from 'semver';
5import chalk from 'chalk';
6import inquirer from 'inquirer';
7import { safeDump } from '../../shared/yaml';
8
9async 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
41async 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
86module.exports = (ctx: any) => {
87 ctx.commander.register('upgrade', 'upgrade fef cli', () => {
88 checkCliUpdate(ctx);
89 });
90};
91
92module.exports.updateCli = updateCli;
93module.exports.checkCliUpdate = checkCliUpdate;