index.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. var less = accord.load('less');
  9. module.exports = function (options) {
  10. // Mixes in default options.
  11. var opts = assign({}, {
  12. compress: false,
  13. paths: []
  14. }, options);
  15. return through2.obj(function(file, enc, cb) {
  16. if (file.isNull()) {
  17. return cb(null, file);
  18. }
  19. if (file.isStream()) {
  20. return cb(new PluginError('gulp-less', 'Streaming not supported'));
  21. }
  22. var str = file.contents.toString();
  23. // Injects the path of the current file
  24. opts.filename = file.path;
  25. // Bootstrap source maps
  26. if (file.sourceMap) {
  27. opts.sourcemap = true;
  28. }
  29. less.render(str, opts).then(function(res) {
  30. file.contents = new Buffer(res.result);
  31. file.path = replaceExt(file.path, '.css');
  32. if (res.sourcemap) {
  33. res.sourcemap.file = file.relative;
  34. res.sourcemap.sources = res.sourcemap.sources.map(function (source) {
  35. return path.relative(file.base, source);
  36. });
  37. applySourceMap(file, res.sourcemap);
  38. }
  39. return file;
  40. }).then(function(file) {
  41. cb(null, file);
  42. }).catch(function(err) {
  43. // Convert the keys so PluginError can read them
  44. err.lineNumber = err.line;
  45. err.fileName = err.filename;
  46. // Add a better error message
  47. err.message = err.message + ' in file ' + err.fileName + ' line no. ' + err.lineNumber;
  48. return cb(new PluginError('gulp-less', err));
  49. });
  50. });
  51. };