index.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. var path = require('path');
  2. var PluginError = require('plugin-error');
  3. var Vinyl = require('vinyl');
  4. var through = require('through2');
  5. var customizr = require('customizr');
  6. module.exports = function(fileName, opt) {
  7. 'use strict';
  8. // Set some defaults
  9. var PLUGIN_NAME = 'gulp-modernizr';
  10. var DEFAULT_FILE_NAME = 'modernizr.js';
  11. // Ensure fileName exists
  12. if (typeof fileName === 'undefined') {
  13. fileName = opt ? opt.dest : DEFAULT_FILE_NAME;
  14. } else if (typeof fileName === typeof{}) {
  15. opt = fileName;
  16. fileName = DEFAULT_FILE_NAME;
  17. }
  18. // Ensure opt exists
  19. opt = opt || {};
  20. // Enable string parsing in customizr
  21. opt.useBuffers = true;
  22. // Set crawl to false, Gulp is providing files & data
  23. opt.crawl = false;
  24. // Reset opt.files. Store buffers here.
  25. opt.files = {
  26. src: [],
  27. };
  28. // Per Gulp docs (https://github.com/gulpjs/gulp/blob/master/docs/writing-a-plugin/guidelines.md)
  29. // "Your plugin shouldn't do things that other plugins are responsible for"
  30. opt.uglify = false;
  31. // Save first file for metadata purposes
  32. var firstFile,
  33. stream;
  34. function storeBuffers(file, enc, callback) {
  35. // Return if null
  36. if (file.isNull()) {
  37. stream.push(file);
  38. return callback();
  39. }
  40. // No stream support (yet?)
  41. if (file.isStream()) {
  42. stream.emit('error', new PluginError({
  43. plugin: PLUGIN_NAME,
  44. message: 'Streaming not supported',
  45. }));
  46. return callback();
  47. }
  48. // Set first file
  49. if (!firstFile) {
  50. firstFile = file;
  51. }
  52. // Save buffer for later use
  53. opt.files.src.push(file);
  54. return callback();
  55. }
  56. function generateModernizr(callback) {
  57. if (opt.files.src.length === 0) {
  58. return callback();
  59. }
  60. // Call customizr
  61. customizr(opt, function(data) {
  62. // Sanity check
  63. if (!data.result) {
  64. return stream.emit('error', new PluginError({
  65. plugin: PLUGIN_NAME,
  66. message: 'No data returned',
  67. }));
  68. }
  69. // Save result
  70. var file = new Vinyl({
  71. path: path.join(firstFile.base, fileName),
  72. base: firstFile.base,
  73. cwd: firstFile.cwd,
  74. contents: Buffer.from(data.result),
  75. });
  76. // Pass data along
  77. stream.push(file);
  78. return callback();
  79. });
  80. }
  81. stream = through.obj(storeBuffers, generateModernizr);
  82. return stream;
  83. };