Skip to content

Commit f7535b8

Browse files
author
刘祺
committed
Merge branch 'master' into error_details
2 parents fe8e5f5 + 604a264 commit f7535b8

File tree

5 files changed

+352
-64
lines changed

5 files changed

+352
-64
lines changed

.travis.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
sudo: false
22
language: node_js
33
node_js:
4-
- iojs
5-
- "stable"
6-
- "0.12"
7-
- "0.10"
4+
- stable
5+
- 6
6+
- 4
7+
- 0.12

README.md

Lines changed: 97 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# gulp-postcss [![Build Status](https://api.travis-ci.org/postcss/gulp-postcss.png)](https://travis-ci.org/postcss/gulp-postcss)
22

33
[PostCSS](https://github.com/postcss/postcss) gulp plugin to pipe CSS through
4-
several processors, but parse CSS only once.
4+
several plugins, but parse CSS only once.
55

66
## Install
77

@@ -11,19 +11,36 @@ Install required [postcss plugins](https://www.npmjs.com/browse/keyword/postcss-
1111

1212
## Basic usage
1313

14+
The configuration is loaded automatically from `postcss.config.js`
15+
as [described here](https://www.npmjs.com/package/postcss-load-config),
16+
so you don't have to specify any options.
17+
18+
```js
19+
var postcss = require('gulp-postcss');
20+
var gulp = require('gulp');
21+
22+
gulp.task('css', function () {
23+
return gulp.src('./src/*.css')
24+
.pipe(postcss())
25+
.pipe(gulp.dest('./dest'));
26+
});
27+
```
28+
29+
## Passing plugins directly
30+
1431
```js
1532
var postcss = require('gulp-postcss');
1633
var gulp = require('gulp');
1734
var autoprefixer = require('autoprefixer');
1835
var cssnano = require('cssnano');
1936

2037
gulp.task('css', function () {
21-
var processors = [
38+
var plugins = [
2239
autoprefixer({browsers: ['last 1 version']}),
23-
cssnano(),
40+
cssnano()
2441
];
2542
return gulp.src('./src/*.css')
26-
.pipe(postcss(processors))
43+
.pipe(postcss(plugins))
2744
.pipe(gulp.dest('./dest'));
2845
});
2946
```
@@ -32,18 +49,18 @@ gulp.task('css', function () {
3249

3350
The second optional argument to gulp-postcss is passed to PostCSS.
3451

35-
This, for instance, may be used to enable custom syntax:
52+
This, for instance, may be used to enable custom parser:
3653

3754
```js
3855
var gulp = require('gulp');
3956
var postcss = require('gulp-postcss');
4057
var nested = require('postcss-nested');
41-
var scss = require('postcss-scss');
58+
var sugarss = require('sugarss');
4259

4360
gulp.task('default', function () {
44-
var processors = [nested];
45-
return gulp.src('in.css')
46-
.pipe(postcss(processors, {syntax: scss}))
61+
var plugins = [nested];
62+
return gulp.src('in.sss')
63+
.pipe(postcss(plugins, { parser: sugarss }))
4764
.pipe(gulp.dest('out'));
4865
});
4966
```
@@ -65,12 +82,12 @@ var opacity = function (css, opts) {
6582
};
6683

6784
gulp.task('css', function () {
68-
var processors = [
85+
var plugins = [
6986
cssnext({browsers: ['last 1 version']}),
70-
opacity,
87+
opacity
7188
];
7289
return gulp.src('./src/*.css')
73-
.pipe(postcss(processors))
90+
.pipe(postcss(plugins))
7491
.pipe(gulp.dest('./dest'));
7592
});
7693
```
@@ -83,13 +100,77 @@ with [gulp-sourcemaps](https://github.com/floridoo/gulp-sourcemaps).
83100
```js
84101
return gulp.src('./src/*.css')
85102
.pipe(sourcemaps.init())
86-
.pipe(postcss(processors))
103+
.pipe(postcss(plugins))
87104
.pipe(sourcemaps.write('.'))
88105
.pipe(gulp.dest('./dest'));
89106
```
90107

108+
## Advanced usage
109+
110+
If you want to configure postcss on per-file-basis, you can pass a callback
111+
that receives [vinyl file object](https://github.com/gulpjs/vinyl) and returns
112+
`{ plugins: plugins, options: options }`. For example, when you need to
113+
parse different extensions differntly:
114+
115+
```js
116+
var gulp = require('gulp');
117+
var postcss = require('gulp-postcss');
118+
119+
gulp.task('css', function () {
120+
function callback(file) {
121+
return {
122+
plugins: [
123+
require('postcss-import')({ root: file.dirname }),
124+
require('postcss-modules')
125+
],
126+
options: {
127+
parser: file.extname === '.sss' ? require('sugarss') : false
128+
}
129+
}
130+
}
131+
return gulp.src('./src/*.css')
132+
.pipe(postcss(callback))
133+
.pipe(gulp.dest('./dest'));
134+
});
135+
```
136+
137+
The same result may be achieved with
138+
[`postcss-load-config`](https://www.npmjs.com/package/postcss-load-config),
139+
because it receives `ctx` with the context options and the vinyl file.
140+
141+
```js
142+
var gulp = require('gulp');
143+
var postcss = require('gulp-postcss');
144+
145+
gulp.task('css', function () {
146+
var contextOptions = { modules: true };
147+
return gulp.src('./src/*.css')
148+
.pipe(postcss(contextOptions))
149+
.pipe(gulp.dest('./dest'));
150+
});
151+
```
152+
153+
```js
154+
module.exports = function (ctx) {
155+
var file = ctx.file;
156+
var options = ctx.options;
157+
return {
158+
parser: file.extname === '.sss' ? : 'sugarss' : false,
159+
plugins: {
160+
'postcss-import': { root: file.dirname }
161+
'postcss-modules': options.modules ? {} : false
162+
}
163+
}
164+
})
165+
```
166+
91167
## Changelog
92168

169+
* 6.3.0
170+
* Integrated with postcss-load-config
171+
* Added a callback to configure postcss on per-file-basis
172+
* Dropped node 0.10 support
173+
93174
* 6.2.0
94175
* Fix syntax error message for PostCSS 5.2 compatibility
95176

@@ -124,7 +205,7 @@ return gulp.src('./src/*.css')
124205

125206
* 5.1.4
126207
* Simplified error handling
127-
* Simplified postcss execution with object processors
208+
* Simplified postcss execution with object plugins
128209

129210
* 5.1.3 Updated travis banner
130211

@@ -139,7 +220,7 @@ return gulp.src('./src/*.css')
139220
* Display `result.warnings()` content
140221

141222
* 5.0.1
142-
* Fix to support object processors
223+
* Fix to support object plugins
143224

144225
* 5.0.0
145226
* Use async API
@@ -173,7 +254,7 @@ return gulp.src('./src/*.css')
173254
* Improved README
174255

175256
* 1.0.1
176-
* Don't add source map comment if used with gulp-sourcemap
257+
* Don't add source map comment if used with gulp-sourcemaps
177258

178259
* 1.0.0
179260
* Initial release

index.js

Lines changed: 67 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@ var gutil = require('gulp-util')
55
var path = require('path')
66

77

8-
module.exports = function (processors, options) {
9-
10-
if (!Array.isArray(processors)) {
11-
throw new gutil.PluginError('gulp-postcss', 'Please provide array of postcss processors!')
12-
}
8+
module.exports = withConfigLoader(function (loadConfig) {
139

1410
var stream = new Stream.Transform({ objectMode: true })
1511

@@ -23,29 +19,36 @@ module.exports = function (processors, options) {
2319
return handleError('Streams are not supported!')
2420
}
2521

26-
// Source map is disabled by default
27-
var opts = { map: false }
28-
var attr
22+
// Protect `from` and `map` if using gulp-sourcemaps
23+
var isProtected = file.sourceMap
24+
? { from: true, map: true }
25+
: {}
2926

30-
// Extend default options
31-
if (options) {
32-
for (attr in options) {
33-
if (options.hasOwnProperty(attr)) {
34-
opts[attr] = options[attr]
35-
}
36-
}
27+
var options = {
28+
from: file.path
29+
, to: file.path
30+
// Generate a separate source map for gulp-sourcemaps
31+
, map: file.sourceMap ? { annotation: false } : false
3732
}
3833

39-
opts.from = file.path
40-
opts.to = opts.to || file.path
41-
42-
// Generate separate source map for gulp-sourcemap
43-
if (file.sourceMap) {
44-
opts.map = { annotation: false }
45-
}
46-
47-
postcss(processors)
48-
.process(file.contents, opts)
34+
loadConfig(file)
35+
.then(function (config) {
36+
var configOpts = config.options || {}
37+
// Extend the default options if not protected
38+
for (var opt in configOpts) {
39+
if (configOpts.hasOwnProperty(opt) && !isProtected[opt]) {
40+
options[opt] = configOpts[opt]
41+
} else {
42+
gutil.log(
43+
'gulp-postcss:',
44+
file.relative + '\nCannot override ' + opt +
45+
' option, because it is required by gulp-sourcemaps'
46+
)
47+
}
48+
}
49+
return postcss(config.plugins || [])
50+
.process(file.contents, options)
51+
})
4952
.then(handleResult, handleError)
5053

5154
function handleResult (result) {
@@ -93,4 +96,43 @@ module.exports = function (processors, options) {
9396
}
9497

9598
return stream
99+
})
100+
101+
102+
function withConfigLoader(cb) {
103+
return function (plugins, options) {
104+
if (Array.isArray(plugins)) {
105+
return cb(function () {
106+
return Promise.resolve({
107+
plugins: plugins
108+
, options: options
109+
})
110+
})
111+
} else if (typeof plugins === 'function') {
112+
return cb(function (file) {
113+
return Promise.resolve(plugins(file))
114+
})
115+
} else {
116+
var postcssLoadConfig = require('postcss-load-config')
117+
var contextOptions = plugins || {}
118+
return cb(function(file) {
119+
var configPath
120+
if (contextOptions.config) {
121+
if (path.isAbsolute(contextOptions.config)) {
122+
configPath = contextOptions.config
123+
} else {
124+
configPath = path.join(file.base, contextOptions.config)
125+
}
126+
} else {
127+
configPath = file.dirname
128+
}
129+
return postcssLoadConfig(
130+
{ file: file
131+
, options: contextOptions
132+
},
133+
configPath
134+
)
135+
})
136+
}
137+
}
96138
}

package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "gulp-postcss",
3-
"version": "6.2.0",
3+
"version": "6.3.0",
44
"description": "PostCSS gulp plugin",
55
"main": "index.js",
66
"scripts": {
@@ -23,14 +23,14 @@
2323
},
2424
"homepage": "https://github.com/postcss/gulp-postcss",
2525
"dependencies": {
26-
"gulp-util": "^3.0.7",
27-
"postcss": "^5.2.0",
28-
"vinyl-sourcemaps-apply": "^0.2.0"
26+
"gulp-util": "^3.0.8",
27+
"postcss": "^5.2.10",
28+
"postcss-load-config": "^1.1.0",
29+
"vinyl-sourcemaps-apply": "^0.2.1"
2930
},
3031
"devDependencies": {
31-
"es6-promise": "^3.0.2",
32-
"gulp-sourcemaps": "^1.5.1",
33-
"mocha": "^2.2.5",
32+
"gulp-sourcemaps": "^1.11.0",
33+
"mocha": "^3.2.0",
3434
"proxyquire": "^1.7.4",
3535
"sinon": "^1.17.3"
3636
}

0 commit comments

Comments
 (0)