1 | var less = require('less');
|
2 | var through2 = require('through2');
|
3 | var gutil = require('gulp-util');
|
4 | var PluginError = gutil.PluginError;
|
5 | var path = require('path');
|
6 | var defaults = require('lodash.defaults');
|
7 | var convert = require('convert-source-map');
|
8 | var applySourceMap = require('vinyl-sourcemaps-apply');
|
9 |
|
10 | module.exports = function (options) {
|
11 |
|
12 | options = defaults(options || {}, {
|
13 | compress: false,
|
14 | paths: []
|
15 | });
|
16 |
|
17 | function transform (file, enc, next) {
|
18 | var self = this;
|
19 |
|
20 | if (file.isNull()) {
|
21 | this.push(file);
|
22 | return next();
|
23 | }
|
24 |
|
25 | if (file.isStream()) {
|
26 | this.emit('error', new PluginError('gulp-less', 'Streaming not supported'));
|
27 | return next();
|
28 | }
|
29 |
|
30 | var str = file.contents.toString('utf8');
|
31 |
|
32 |
|
33 | var opts = defaults({}, options);
|
34 |
|
35 |
|
36 | opts.filename = file.path;
|
37 |
|
38 |
|
39 | opts.sourceMap = false;
|
40 |
|
41 | if (file.sourceMap) {
|
42 | opts.sourceMap = true;
|
43 | }
|
44 |
|
45 | less.render(str, opts, function (err, css) {
|
46 | if (err) {
|
47 |
|
48 |
|
49 | err.lineNumber = err.line;
|
50 | err.fileName = err.filename;
|
51 |
|
52 |
|
53 | err.message = err.message + ' in file ' + err.fileName + ' line no. ' + err.lineNumber;
|
54 |
|
55 | self.emit('error', new PluginError('gulp-less', err));
|
56 | } else {
|
57 | file.contents = new Buffer(css);
|
58 | file.path = gutil.replaceExtension(file.path, '.css');
|
59 |
|
60 | if (file.sourceMap) {
|
61 | var comment = convert.fromSource(css);
|
62 | if (comment) {
|
63 | file.contents = new Buffer(convert.removeComments(css));
|
64 | var sourceMap = comment.sourcemap;
|
65 | for (var i = 0; i < sourceMap.sources.length; i++) {
|
66 | sourceMap.sources[i] = path.relative(file.base, sourceMap.sources[i]);
|
67 | }
|
68 | applySourceMap(file, sourceMap);
|
69 | }
|
70 | }
|
71 |
|
72 |
|
73 | self.push(file);
|
74 | }
|
75 | next();
|
76 | });
|
77 | }
|
78 |
|
79 | return through2.obj(transform);
|
80 | };
|
81 |
|
82 |
|