Skip to content

Commit a5e14ae

Browse files
committed
Refactor: Remove webpack from peerDependencies
Check webpack availability and version at run time instead of using peerDependencies to allow usage of build tools that contains webpack as their own dependency, like Create React App. See discussion here: facebook/create-react-app#2044
1 parent 1554e76 commit a5e14ae

8 files changed

+123
-76
lines changed

bin/styleguidist.js

+21-14
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,27 @@ const StyleguidistError = require('../scripts/utils/error');
1515
const argv = minimist(process.argv.slice(2));
1616
const command = argv._[0];
1717

18+
// Do not show nasty stack traces for Styleguidist errors
19+
process.on('uncaughtException', err => {
20+
if (err.code === 'EADDRINUSE') {
21+
printErrorWithLink(
22+
`You have another server running at port ${config.serverPort} somewhere, shut it down first`,
23+
'You can change the port using the `serverPort` option in your style guide config:',
24+
consts.DOCS_CONFIG
25+
);
26+
} else if (err instanceof StyleguidistError) {
27+
console.error(chalk.bold.red(err.message));
28+
logger.debug(err.stack);
29+
process.exit(1);
30+
} else {
31+
throw err;
32+
}
33+
process.exit(1);
34+
});
35+
36+
// Make sure user has webpack installed
37+
require('../scripts/utils/ensureWebpack');
38+
1839
// Set environment before loading style guide config because user’s webpack config may use it
1940
const env = command === 'build' ? 'production' : 'development';
2041
process.env.NODE_ENV = env;
@@ -80,20 +101,6 @@ function commandBuild() {
80101
}
81102

82103
function commandServer() {
83-
process.on('uncaughtException', err => {
84-
if (err.code === 'EADDRINUSE') {
85-
printErrorWithLink(
86-
`You have another server running at port ${config.serverPort} somewhere, shut it down first`,
87-
'You can change the port using the `serverPort` option in your style guide config:',
88-
consts.DOCS_CONFIG
89-
);
90-
} else {
91-
console.error(chalk.bold.red(err.message));
92-
logger.debug(err.stack);
93-
}
94-
process.exit(1);
95-
});
96-
97104
const server = require('../scripts/server');
98105
const compiler = server(config, err => {
99106
if (err) {

docs/GettingStarted.md

+10-16
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,19 @@
22

33
## 1. Install Styleguidist
44

5-
1. Install Styleguidist and peer dependencies from npm:
5+
Install Styleguidist from npm:
66

7-
```bash
8-
npm install --save-dev react-styleguidist react react-dom webpack
9-
```
10-
11-
2. [Point Styleguidist to your React components](Components.md)
12-
13-
3. [Tell Styleguidist how to load your code](Webpack.md)
7+
```bash
8+
npm install --save-dev react-styleguidist
9+
```
1410

15-
> **Note:** Webpack is a peer dependency but your project doesn’t have to use it. Styleguidist works with webpack 1 and webpack 2.
11+
## 2. Configure your style guide
1612

17-
**If you’re using [Create React App](https://github.com/facebookincubator/create-react-app) you only need this:**
13+
**If you’re using [Create React App](https://github.com/facebookincubator/create-react-app) you can skip this step.**
1814

19-
```bash
20-
npm install --save-dev react-styleguidist webpack
21-
```
15+
[Point Styleguidist to your React components](Components.md) and [tell how to load your code](Webpack.md).
2216

23-
## 2. Add npm scripts for convenience (optional)
17+
## 3. Add npm scripts for convenience
2418

2519
Add these scripts to your `package.json`:
2620

@@ -33,13 +27,13 @@ Add these scripts to your `package.json`:
3327
}
3428
```
3529

36-
## 3. Start your style guide
30+
## 4. Start your style guide
3731

3832
Run **`npm run styleguide`** to start style a guide dev server.
3933

4034
Run **`npm run styleguide:build`** to build a static version.
4135

42-
## 4. Start documenting your components
36+
## 5. Start documenting your components
4337

4438
See how to [document your components](Documenting.md)
4539

package-lock.json

+54-36
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@
8383
},
8484
"peerDependencies": {
8585
"react": ">=15",
86-
"react-dom": ">=15",
87-
"webpack": ">=1"
86+
"react-dom": ">=15"
8887
},
8988
"devDependencies": {
9089
"babel-cli": "^6.24.1",

scripts/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
'use strict';
22

3+
// Make sure user has webpack installed
4+
require('./utils/ensureWebpack');
5+
36
const build = require('./build');
47
const server = require('./server');
58
const makeWebpackConfig = require('./make-webpack-config');

scripts/make-webpack-config.js

-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ const HtmlWebpackPlugin = require('html-webpack-plugin');
66
const merge = require('webpack-merge');
77
const CleanWebpackPlugin = require('clean-webpack-plugin');
88
const forEach = require('lodash/forEach');
9-
const logger = require('glogg')('rsg');
109
const hasJsonLoader = require('./utils/hasJsonLoader');
1110
const getWebpackVersion = require('./utils/getWebpackVersion');
1211
const mergeWebpackConfig = require('./utils/mergeWebpackConfig');
@@ -21,12 +20,6 @@ const htmlLoader = require.resolve('html-webpack-plugin/lib/loader');
2120
module.exports = function(config, env) {
2221
process.env.NODE_ENV = process.env.NODE_ENV || env;
2322

24-
if (isWebpack1) {
25-
logger.warn(
26-
'Support for webpack 1 will be removed in the next major version of React Styleguidist.'
27-
);
28-
}
29-
3023
const isProd = env === 'production';
3124

3225
let webpackConfig = {

scripts/utils/ensureWebpack.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict';
2+
3+
/**
4+
* Check webpack availability and version at run time instead of using peerDependencies to allow
5+
* usage of build tools that contains webpack as their own dependency, like Create React App.
6+
*/
7+
8+
const logger = require('glogg')('rsg');
9+
const getWebpackVersion = require('./getWebpackVersion');
10+
const StyleguidistError = require('./error');
11+
const consts = require('../consts');
12+
13+
const MIN_WEBPACK_VERSION = 1;
14+
const webpackVersion = getWebpackVersion();
15+
16+
if (!webpackVersion) {
17+
throw new StyleguidistError(
18+
'Webpack is required for Styleguidist, please add it to your project:\n\n' +
19+
' npm install --save-dev webpack\n\n' +
20+
'See how to configure it for your style guide:\n' +
21+
consts.DOCS_WEBPACK
22+
);
23+
} else if (webpackVersion < MIN_WEBPACK_VERSION) {
24+
throw new StyleguidistError(
25+
`Webpack ${webpackVersion} is not supported by Styleguidist, the minimum version is ${MIN_WEBPACK_VERSION}`
26+
);
27+
} else if (webpackVersion < 2) {
28+
logger.warn('Support for webpack 1 will be removed in the next major version of Styleguidist');
29+
}

scripts/utils/getWebpackVersion.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,9 @@ const semverUtils = require('semver-utils');
88
* @return {number}
99
*/
1010
module.exports = function getWebpackVersion() {
11-
return Number(semverUtils.parseRange(require('webpack/package.json').version)[0].major);
11+
try {
12+
return Number(semverUtils.parseRange(require('webpack/package.json').version)[0].major);
13+
} catch (err) {
14+
return undefined;
15+
}
1216
};

0 commit comments

Comments
 (0)