styles.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. var path = require('path');
  2. var gulp = require('gulp');
  3. var sass = require('gulp-sass');
  4. var cssnano = require('gulp-cssnano');
  5. var sourcemaps = require('gulp-sourcemaps');
  6. var size = require('gulp-size');
  7. var config = require('../config');
  8. var autoprefixer = require('gulp-autoprefixer');
  9. var simpleCopyTask = require('../lib/simplyCopy');
  10. var normalizePath = require('../lib/normalize-path');
  11. var renameSrcToDest = require('../lib/rename-src-to-dest');
  12. var gutil = require('gulp-util');
  13. var flatten = function(arrOfArr) {
  14. return arrOfArr.reduce(function(flat, more) {
  15. return flat.concat(more);
  16. }, []);
  17. };
  18. var autoprefixerConfig = {
  19. browsers: [
  20. 'Firefox ESR',
  21. 'ie 11',
  22. 'last 2 Chrome versions',
  23. 'last 2 ChromeAndroid versions',
  24. 'last 2 Edge versions',
  25. 'last 1 Firefox version',
  26. 'last 2 iOS versions',
  27. 'last 2 Safari versions',
  28. ],
  29. cascade: false,
  30. };
  31. var cssnanoConfig = {
  32. discardUnused: {
  33. fontFace: false,
  34. },
  35. zindex: false,
  36. };
  37. gulp.task('styles', ['styles:sass', 'styles:css', 'styles:assets']);
  38. // Copy all assets that are not CSS files.
  39. gulp.task('styles:assets', simpleCopyTask('css/**/!(*.css)'));
  40. gulp.task('styles:css', function() {
  41. var sources = config.apps.map(function(app) {
  42. return path.join(app.sourceFiles, app.appName, 'css/**/*.css');
  43. });
  44. return gulp.src(sources, {base: '.'})
  45. .pipe(cssnano(cssnanoConfig))
  46. .pipe(autoprefixer(autoprefixerConfig))
  47. .pipe(renameSrcToDest())
  48. .pipe(size({ title: 'Vendor CSS' }))
  49. .pipe(gulp.dest('.'))
  50. .on('error', gutil.log);
  51. });
  52. // For Sass files,
  53. gulp.task('styles:sass', function () {
  54. // Wagtail Sass files include each other across applications,
  55. // e.g. wagtailimages Sass files will include wagtailadmin/sass/mixins.scss
  56. // Thus, each app is used as an includePath.
  57. var includePaths = flatten(config.apps.map(function(app) { return app.scssIncludePaths(); }));
  58. // Not all files in a directory need to be compiled, so each app defines
  59. // its own Sass files that need to be compiled.
  60. var sources = flatten(config.apps.map(function(app) { return app.scssSources(); }));
  61. return gulp.src(sources)
  62. .pipe(config.isProduction ? gutil.noop() : sourcemaps.init())
  63. .pipe(sass({
  64. errLogToConsole: true,
  65. includePaths: includePaths,
  66. outputStyle: 'expanded'
  67. }).on('error', sass.logError))
  68. .pipe(cssnano(cssnanoConfig))
  69. .pipe(autoprefixer(autoprefixerConfig))
  70. .pipe(size({ title: 'Wagtail CSS' }))
  71. .pipe(config.isProduction ? gutil.noop() : sourcemaps.write())
  72. .pipe(gulp.dest(function (file) {
  73. // e.g. wagtailadmin/scss/core.scss -> wagtailadmin/css/core.css
  74. // Changing the suffix is done by Sass automatically
  75. return normalizePath(file.base)
  76. .replace(
  77. '/' + config.srcDir + '/',
  78. '/' + config.destDir + '/'
  79. )
  80. .replace('/scss/', '/css/');
  81. }))
  82. .on('error', gutil.log);
  83. });