Skip to content

Commit 4efdb5b

Browse files
authored
Merge pull request #1079 from storybooks/cli/improvement-versioning
IMPROVE cli
2 parents 2567684 + a52ab86 commit 4efdb5b

File tree

7 files changed

+168
-154
lines changed

7 files changed

+168
-154
lines changed

lib/cli/bin/generate.js

Lines changed: 37 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ updateNotifier({
3939

4040
let projectType;
4141

42-
let done = commandLog('Detecting project type');
42+
const done = commandLog('Detecting project type');
4343
try {
4444
projectType = detect({
4545
force: program.force,
@@ -50,89 +50,67 @@ try {
5050
}
5151
done();
5252

53+
const end = () => {
54+
installDeps(npmOptions);
55+
56+
logger.log('\nTo run your storybook, type:\n');
57+
codeLog([runStorybookCommand]);
58+
logger.log('\nFor more information visit:', chalk.cyan('https://storybooks.js.org'));
59+
60+
// Add a new line for the clear visibility.
61+
logger.log();
62+
};
63+
5364
switch (projectType) {
5465
case types.ALREADY_HAS_STORYBOOK:
5566
logger.log();
5667
paddedLog('There seems to be a storybook already available in this project.');
5768
paddedLog('Apply following command to force:\n');
5869
codeLog(['getstorybook -f']);
70+
71+
// Add a new line for the clear visibility.
72+
logger.log();
5973
break;
6074
case types.REACT_SCRIPTS:
61-
done = commandLog('Adding storybook support to your "Create React App" based project');
62-
require('../generators/REACT_SCRIPTS');
63-
done();
64-
65-
installDeps(npmOptions);
66-
67-
logger.log('\nTo run your storybook, type:\n');
68-
codeLog([runStorybookCommand]);
69-
logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io'));
75+
require('../generators/REACT_SCRIPTS')
76+
.then(commandLog('Adding storybook support to your "Create React App" based project'))
77+
.then(end);
7078
break;
7179

7280
case types.REACT:
73-
done = commandLog('Adding storybook support to your "React" app');
74-
require('../generators/REACT');
75-
done();
76-
77-
installDeps(npmOptions);
78-
79-
logger.log('\nTo run your storybook, type:\n');
80-
codeLog([runStorybookCommand]);
81-
logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io'));
81+
require('../generators/REACT')
82+
.then(commandLog('Adding storybook support to your "React" app'))
83+
.then(end);
8284
break;
8385

8486
case types.REACT_NATIVE:
85-
done = commandLog('Adding storybook support to your "React Native" app');
86-
require('../generators/REACT_NATIVE');
87-
done();
88-
89-
installDeps(npmOptions);
90-
91-
logger.log('\nTo run your storybook, type:\n');
92-
codeLog([runStorybookCommand]);
93-
logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io'));
87+
require('../generators/REACT_NATIVE')
88+
.then(commandLog('Adding storybook support to your "React Native" app'))
89+
.then(end);
9490
break;
9591

9692
case types.METEOR:
97-
done = commandLog('Adding storybook support to your "Meteor" app');
98-
require('../generators/METEOR');
99-
done();
100-
101-
installDeps(npmOptions);
102-
103-
logger.log('\nTo run your storybook, type:\n');
104-
codeLog([runStorybookCommand]);
105-
logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io'));
93+
require('../generators/METEOR')
94+
.then(commandLog('Adding storybook support to your "Meteor" app'))
95+
.then(end);
10696
break;
10797

10898
case types.WEBPACK_REACT:
109-
done = commandLog('Adding storybook support to your "Webpack React" app');
110-
require('../generators/WEBPACK_REACT');
111-
done();
112-
113-
installDeps(npmOptions);
114-
115-
logger.log('\nTo run your storybook, type:\n');
116-
codeLog([runStorybookCommand]);
117-
logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io'));
99+
require('../generators/WEBPACK_REACT')
100+
.then(commandLog('Adding storybook support to your "Webpack React" app'))
101+
.then(end);
118102
break;
119103

120104
case types.REACT_PROJECT:
121-
done = commandLog('Adding storybook support to your "React" library');
122-
require('../generators/REACT');
123-
done();
124-
125-
installDeps(npmOptions);
126-
127-
logger.log('\nTo run your storybook, type:\n');
128-
codeLog([runStorybookCommand]);
129-
logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io'));
105+
require('../generators/REACT')
106+
.then(commandLog('Adding storybook support to your "React" library'))
107+
.then(end);
130108
break;
131109

132110
default:
133111
paddedLog(`Unsupported Project type. (code: ${projectType})`);
134-
paddedLog('Visit http://getstorybook.io for more information.');
135-
}
112+
paddedLog('Visit https://storybooks.js.org for more information.');
136113

137-
// Add a new line for the clear visibility.
138-
logger.log();
114+
// Add a new line for the clear visibility.
115+
logger.log();
116+
}

lib/cli/generators/METEOR/index.js

Lines changed: 72 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,76 @@ const path = require('path');
44
const fs = require('fs');
55
const sh = require('shelljs');
66
const JSON5 = require('json5');
7+
const latestVersion = require('latest-version');
78

8-
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
9-
10-
const packageJson = helpers.getPackageJson();
11-
packageJson.devDependencies = packageJson.devDependencies || {};
12-
packageJson.scripts = packageJson.scripts || {};
13-
packageJson.dependencies = packageJson.dependencies || {};
14-
15-
// create or update .babelrc
16-
let babelrc = null;
17-
if (fs.existsSync('.babelrc')) {
18-
const babelrcContent = fs.readFileSync('.babelrc', 'utf8');
19-
babelrc = JSON5.parse(babelrcContent);
20-
babelrc.plugins = babelrc.plugins || [];
21-
22-
if (babelrc.plugins.indexOf('babel-root-slash-import') < 0) {
23-
babelrc.plugins.push('babel-root-slash-import');
24-
packageJson.devDependencies['babel-root-slash-import'] = '^1.1.0';
25-
}
26-
} else {
27-
babelrc = {
28-
presets: ['es2015', 'es2016', 'react', 'stage-1'],
29-
plugins: ['babel-root-slash-import'],
30-
};
31-
32-
packageJson.devDependencies['babel-preset-es2015'] = '^6.9.0';
33-
packageJson.devDependencies['babel-preset-es2016'] = '^6.11.3';
34-
packageJson.devDependencies['babel-preset-react'] = '^6.11.1';
35-
packageJson.devDependencies['babel-preset-stage-1'] = '^6.13.0';
36-
packageJson.devDependencies['babel-root-slash-import'] = '^1.1.0';
37-
}
38-
39-
fs.writeFileSync('.babelrc', JSON.stringify(babelrc, null, 2), 'utf8');
40-
41-
// write the new package.json.
42-
packageJson.devDependencies['@storybook/react'] = '^2.21.0';
43-
packageJson.scripts['storybook'] = 'start-storybook -p 6006';
44-
packageJson.scripts['build-storybook'] = 'build-storybook';
45-
46-
// add react packages.
47-
if (!packageJson.dependencies.react) {
48-
packageJson.dependencies.react = '^15.3.0';
49-
}
50-
if (!packageJson.dependencies['react-dom']) {
51-
packageJson.dependencies['react-dom'] = '^15.3.0';
52-
}
53-
54-
helpers.writePackageJson(packageJson);
9+
module.exports = Promise.all([
10+
latestVersion('@storybook/react'),
11+
latestVersion('react'),
12+
latestVersion('react-dom'),
13+
latestVersion('babel-preset-es2015'),
14+
latestVersion('babel-preset-es2016'),
15+
latestVersion('babel-preset-react'),
16+
latestVersion('babel-preset-stage-1'),
17+
latestVersion('babel-root-slash-import'),
18+
]).then(
19+
(
20+
[
21+
storybookVersion,
22+
reactVersion,
23+
reactDomVersion,
24+
presetEs2015Version,
25+
presetEs2016Version,
26+
presetReactVersion,
27+
presetStage1Version,
28+
rootSlashImportVersion,
29+
],
30+
) => {
31+
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
32+
33+
const packageJson = helpers.getPackageJson();
34+
packageJson.devDependencies = packageJson.devDependencies || {};
35+
packageJson.scripts = packageJson.scripts || {};
36+
packageJson.dependencies = packageJson.dependencies || {};
37+
38+
// create or update .babelrc
39+
let babelrc = null;
40+
if (fs.existsSync('.babelrc')) {
41+
const babelrcContent = fs.readFileSync('.babelrc', 'utf8');
42+
babelrc = JSON5.parse(babelrcContent);
43+
babelrc.plugins = babelrc.plugins || [];
44+
45+
if (babelrc.plugins.indexOf('babel-root-slash-import') < 0) {
46+
babelrc.plugins.push('babel-root-slash-import');
47+
packageJson.devDependencies['babel-root-slash-import'] = `^${rootSlashImportVersion}`;
48+
}
49+
} else {
50+
babelrc = {
51+
presets: ['es2015', 'es2016', 'react', 'stage-1'],
52+
plugins: ['babel-root-slash-import'],
53+
};
54+
55+
packageJson.devDependencies['babel-preset-es2015'] = `^${presetEs2015Version}`;
56+
packageJson.devDependencies['babel-preset-es2016'] = `^${presetEs2016Version}`;
57+
packageJson.devDependencies['babel-preset-react'] = `^${presetReactVersion}`;
58+
packageJson.devDependencies['babel-preset-stage-1'] = `^${presetStage1Version}`;
59+
packageJson.devDependencies['babel-root-slash-import'] = `^${rootSlashImportVersion}`;
60+
}
61+
62+
fs.writeFileSync('.babelrc', JSON.stringify(babelrc, null, 2), 'utf8');
63+
64+
// write the new package.json.
65+
packageJson.devDependencies['@storybook/react'] = `^${storybookVersion}`;
66+
packageJson.scripts['storybook'] = 'start-storybook -p 6006';
67+
packageJson.scripts['build-storybook'] = 'build-storybook';
68+
69+
// add react packages.
70+
if (!packageJson.dependencies.react) {
71+
packageJson.dependencies.react = `^${reactVersion}`;
72+
}
73+
if (!packageJson.dependencies['react-dom']) {
74+
packageJson.dependencies['react-dom'] = `^${reactDomVersion}`;
75+
}
76+
77+
helpers.writePackageJson(packageJson);
78+
},
79+
);

lib/cli/generators/REACT/index.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
const mergeDirs = require('merge-dirs').default;
22
const helpers = require('../../lib/helpers');
33
const path = require('path');
4+
const latestVersion = require('latest-version');
45

5-
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
6+
module.exports = latestVersion('@storybook/react').then(version => {
7+
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
68

7-
const packageJson = helpers.getPackageJson();
9+
const packageJson = helpers.getPackageJson();
810

9-
// TODO: Get the latest version of storybook here.
10-
packageJson.devDependencies = packageJson.devDependencies || {};
11-
packageJson.devDependencies['@storybook/react'] = '^2.21.0';
11+
packageJson.devDependencies = packageJson.devDependencies || {};
12+
packageJson.devDependencies['@storybook/react'] = `^${version}`;
1213

13-
packageJson.scripts = packageJson.scripts || {};
14-
packageJson.scripts['storybook'] = 'start-storybook -p 6006';
15-
packageJson.scripts['build-storybook'] = 'build-storybook';
14+
packageJson.scripts = packageJson.scripts || {};
15+
packageJson.scripts['storybook'] = 'start-storybook -p 6006';
16+
packageJson.scripts['build-storybook'] = 'build-storybook';
1617

17-
helpers.writePackageJson(packageJson);
18+
helpers.writePackageJson(packageJson);
19+
});

lib/cli/generators/REACT_NATIVE/index.js

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,28 @@ const mergeDirs = require('merge-dirs').default;
22
const helpers = require('../../lib/helpers');
33
const path = require('path');
44
const shell = require('shelljs');
5+
const latestVersion = require('latest-version');
56

6-
// copy all files from the template directory to project directory
7-
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
7+
module.exports = latestVersion('@storybook/react-native').then(version => {
8+
// copy all files from the template directory to project directory
9+
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
810

9-
// set correct project name on entry files if possible
10-
const dirname = shell.ls('-d', 'ios/*.xcodeproj').stdout;
11-
const projectName =
12-
dirname && dirname.slice('ios/'.length, dirname.length - '.xcodeproj'.length - 1);
13-
if (projectName) {
14-
shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.ios.js');
15-
shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.android.js');
16-
}
11+
// set correct project name on entry files if possible
12+
const dirname = shell.ls('-d', 'ios/*.xcodeproj').stdout;
13+
const projectName =
14+
dirname && dirname.slice('ios/'.length, dirname.length - '.xcodeproj'.length - 1);
15+
if (projectName) {
16+
shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.ios.js');
17+
shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.android.js');
18+
}
1719

18-
const packageJson = helpers.getPackageJson();
20+
const packageJson = helpers.getPackageJson();
1921

20-
// TODO: Get the latest version of storybook here.
21-
packageJson.devDependencies = packageJson.devDependencies || {};
22-
packageJson.devDependencies['@storybook/react-native'] = '^2.0.0';
22+
packageJson.devDependencies = packageJson.devDependencies || {};
23+
packageJson.devDependencies['@storybook/react-native'] = `^${version}`;
2324

24-
packageJson.scripts = packageJson.scripts || {};
25-
packageJson.scripts['storybook'] = 'storybook start -p 7007';
25+
packageJson.scripts = packageJson.scripts || {};
26+
packageJson.scripts['storybook'] = 'storybook start -p 7007';
2627

27-
helpers.writePackageJson(packageJson);
28+
helpers.writePackageJson(packageJson);
29+
});

lib/cli/generators/REACT_SCRIPTS/index.js

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,22 @@ const mergeDirs = require('merge-dirs').default;
22
const helpers = require('../../lib/helpers');
33
const path = require('path');
44
const fs = require('fs');
5+
const latestVersion = require('latest-version');
56

6-
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
7+
module.exports = latestVersion('@storybook/react').then(version => {
8+
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
79

8-
const packageJson = helpers.getPackageJson();
10+
const packageJson = helpers.getPackageJson();
911

10-
// TODO: Get the latest version of storybook here.
11-
packageJson.devDependencies['@storybook/react'] = '^2.21.0';
12-
packageJson.scripts['storybook'] = 'start-storybook -p 9009';
13-
packageJson.scripts['build-storybook'] = 'build-storybook';
12+
packageJson.devDependencies['@storybook/react'] = `^${version}`;
13+
packageJson.scripts['storybook'] = 'start-storybook -p 9009';
14+
packageJson.scripts['build-storybook'] = 'build-storybook';
1415

15-
if (fs.existsSync(path.resolve('./public'))) {
16-
// has a public folder and add support to it.
17-
packageJson.scripts['storybook'] += ' -s public';
18-
packageJson.scripts['build-storybook'] += ' -s public';
19-
}
16+
if (fs.existsSync(path.resolve('./public'))) {
17+
// has a public folder and add support to it.
18+
packageJson.scripts['storybook'] += ' -s public';
19+
packageJson.scripts['build-storybook'] += ' -s public';
20+
}
2021

21-
helpers.writePackageJson(packageJson);
22+
helpers.writePackageJson(packageJson);
23+
});
Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
const mergeDirs = require('merge-dirs').default;
22
const helpers = require('../../lib/helpers');
33
const path = require('path');
4+
const latestVersion = require('latest-version');
45

5-
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
6+
module.exports = latestVersion('@storybook/react').then(version => {
7+
mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite');
68

7-
const packageJson = helpers.getPackageJson();
9+
const packageJson = helpers.getPackageJson();
810

9-
// TODO: Get the latest version of storybook here.
10-
packageJson.devDependencies = packageJson.devDependencies || {};
11-
packageJson.devDependencies['@storybook/react'] = '^2.21.0';
11+
packageJson.devDependencies = packageJson.devDependencies || {};
12+
packageJson.devDependencies['@storybook/react'] = `^${version}`;
1213

13-
packageJson.scripts = packageJson.scripts || {};
14-
packageJson.scripts['storybook'] = 'start-storybook -p 6006';
15-
packageJson.scripts['build-storybook'] = 'build-storybook';
14+
packageJson.scripts = packageJson.scripts || {};
15+
packageJson.scripts['storybook'] = 'start-storybook -p 6006';
16+
packageJson.scripts['build-storybook'] = 'build-storybook';
1617

17-
helpers.writePackageJson(packageJson);
18+
helpers.writePackageJson(packageJson);
19+
});

0 commit comments

Comments
 (0)