UNPKG

1.76 kBJavaScriptView Raw
1var path = require('path');
2var accord = require('accord');
3var through2 = require('through2');
4var replaceExt = require('replace-ext');
5var assign = require('object-assign');
6var applySourceMap = require('vinyl-sourcemaps-apply');
7var PluginError = require('plugin-error');
8
9var less = accord.load('less');
10
11module.exports = function (options) {
12 // Mixes in default options.
13 var opts = assign({}, {
14 compress: false,
15 paths: []
16 }, options);
17
18 return through2.obj(function(file, enc, cb) {
19 if (file.isNull()) {
20 return cb(null, file);
21 }
22
23 if (file.isStream()) {
24 return cb(new PluginError('gulp-less', 'Streaming not supported'));
25 }
26
27 var str = file.contents.toString();
28
29 // Injects the path of the current file
30 opts.filename = file.path;
31
32 // Bootstrap source maps
33 if (file.sourceMap) {
34 opts.sourcemap = true;
35 }
36
37 less.render(str, opts).then(function(res) {
38 file.contents = new Buffer(res.result);
39 file.path = replaceExt(file.path, '.css');
40 if (res.sourcemap) {
41 res.sourcemap.file = file.relative;
42 res.sourcemap.sources = res.sourcemap.sources.map(function (source) {
43 return path.relative(file.base, source);
44 });
45
46 applySourceMap(file, res.sourcemap);
47 }
48 return file;
49 }).then(function(file) {
50 cb(null, file);
51 }).catch(function(err) {
52 // Convert the keys so PluginError can read them
53 err.lineNumber = err.line;
54 err.fileName = err.filename;
55
56 // Add a better error message
57 err.message = err.message + ' in file ' + err.fileName + ' line no. ' + err.lineNumber;
58 return cb(new PluginError('gulp-less', err));
59 });
60 });
61};