styles.js 2.9 KB

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