1 | var path = require('path');
|
2 | var accord = require('accord');
|
3 | var through2 = require('through2');
|
4 | var replaceExt = require('replace-ext');
|
5 | var assign = require('object-assign');
|
6 | var applySourceMap = require('vinyl-sourcemaps-apply');
|
7 | var PluginError = require('plugin-error');
|
8 |
|
9 | var less = accord.load('less');
|
10 |
|
11 | module.exports = function (options) {
|
12 |
|
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 |
|
30 | opts.filename = file.path;
|
31 |
|
32 |
|
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 |
|
53 | err.lineNumber = err.line;
|
54 | err.fileName = err.filename;
|
55 |
|
56 |
|
57 | err.message = err.message + ' in file ' + err.fileName + ' line no. ' + err.lineNumber;
|
58 | return cb(new PluginError('gulp-less', err));
|
59 | });
|
60 | });
|
61 | };
|