UNPKG

2.2 kBJavaScriptView Raw
1var less = require('less');
2var through2 = require('through2');
3var gutil = require('gulp-util');
4var PluginError = gutil.PluginError;
5var path = require('path');
6var defaults = require('lodash.defaults');
7var convert = require('convert-source-map');
8var applySourceMap = require('vinyl-sourcemaps-apply');
9
10module.exports = function (options) {
11 // Mixes in default options.
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); // pass along
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 // Clones the options object.
33 var opts = defaults({}, options);
34
35 // Injects the path of the current file.
36 opts.filename = file.path;
37
38 // Disables source maps
39 opts.sourceMap = false;
40 // Enables source maps if gulp-sourcemaps has been initted
41 if (file.sourceMap) {
42 opts.sourceMap = true;
43 }
44
45 less.render(str, opts, function (err, css) {
46 if (err) {
47
48 // convert the keys so PluginError can read them
49 err.lineNumber = err.line;
50 err.fileName = err.filename;
51
52 // add a better error message
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