gulpfile.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. var gulp = require('gulp');
  2. var gutil = require('gulp-util');
  3. var rename = require('gulp-rename');
  4. var path = require('path');
  5. gulp.task('default', ['build', 'watch']);
  6. gulp.task('build', ['styles', 'javascript', 'images', 'fonts']);
  7. var sourceDirName = 'static_src';
  8. var destDirName = 'static';
  9. var renameSrcToDest = function() {
  10. return rename(function(filePath) {
  11. filePath.dirname = filePath.dirname.replace(
  12. '/' + sourceDirName + '/',
  13. '/' + destDirName + '/');
  14. });
  15. };
  16. var flatten = function(arrOfArr) {
  17. return arrOfArr.reduce(function(flat, more) {
  18. return flat.concat(more);
  19. }, []);
  20. };
  21. // A Wagtail app that contains static files
  22. var App = function(dir, options) {
  23. this.dir = dir;
  24. this.options = options || {};
  25. this.appName = this.options.appName || path.basename(dir);
  26. this.sourceFiles = path.join('.', this.dir, sourceDirName);
  27. };
  28. App.prototype = Object.create(null);
  29. App.prototype.scssIncludePaths = function() {
  30. return [this.sourceFiles];
  31. };
  32. App.prototype.scssSources = function() {
  33. if (!this.options.scss) return [];
  34. return this.options.scss.map(function(file) {
  35. return path.join(this.sourceFiles, file);
  36. }, this);
  37. };
  38. // All the Wagtail apps that contain static files
  39. var apps = [
  40. new App('wagtail/wagtailadmin', {
  41. 'scss': [
  42. 'wagtailadmin/scss/core.scss',
  43. 'wagtailadmin/scss/layouts/login.scss',
  44. 'wagtailadmin/scss/layouts/home.scss',
  45. 'wagtailadmin/scss/layouts/page-editor.scss',
  46. 'wagtailadmin/scss/layouts/preview.scss',
  47. 'wagtailadmin/scss/panels/rich-text.scss',
  48. 'wagtailadmin/scss/userbar.scss',
  49. 'wagtailadmin/scss/userbar_embed.scss',
  50. ],
  51. }),
  52. new App('wagtail/wagtaildocs'),
  53. new App('wagtail/wagtailembeds'),
  54. new App('wagtail/wagtailforms'),
  55. new App('wagtail/wagtailimages', {
  56. 'scss': [
  57. 'wagtailimages/scss/add-multiple.scss',
  58. 'wagtailimages/scss/focal-point-chooser.scss',
  59. ],
  60. }),
  61. new App('wagtail/wagtailsnippets'),
  62. new App('wagtail/wagtailusers', {
  63. 'scss': [
  64. 'wagtailusers/scss/groups_edit.scss',
  65. ],
  66. }),
  67. new App('wagtail/contrib/wagtailstyleguide', {
  68. 'scss': [
  69. 'wagtailstyleguide/scss/styleguide.scss'
  70. ],
  71. }),
  72. ];
  73. /*
  74. * Watch - Watch files, trigger tasks when they are modified
  75. */
  76. gulp.task('watch', ['build'], function () {
  77. apps.forEach(function(app) {
  78. gulp.watch(path.join(app.sourceFiles, '*/scss/**'), ['styles:sass']);
  79. gulp.watch(path.join(app.sourceFiles, '*/css/**'), ['styles:css']);
  80. gulp.watch(path.join(app.sourceFiles, '*/js/**'), ['javascript']);
  81. gulp.watch(path.join(app.sourceFiles, '*/images/**'), ['images']);
  82. gulp.watch(path.join(app.sourceFiles, '*/fonts/**'), ['fonts']);
  83. });
  84. });
  85. /*
  86. * Styles
  87. **/
  88. gulp.task('styles', ['styles:sass', 'styles:css']);
  89. // SASS - Compile and move sass
  90. var sass = require('gulp-sass');
  91. var autoprefixer = require('gulp-autoprefixer');
  92. gulp.task('styles:sass', function () {
  93. // Wagtail Sass files include each other across applications,
  94. // e.g. wagtailimages Sass files will include wagtailadmin/sass/mixins.scss
  95. // Thus, each app is used as an includePath.
  96. var includePaths = flatten(apps.map(function(app) { return app.scssIncludePaths(); }));
  97. // Not all files in a directory need to be compiled, so each app defines
  98. // its own Sass files that need to be compiled.
  99. var sources = flatten(apps.map(function(app) { return app.scssSources(); }));
  100. return gulp.src(sources)
  101. .pipe(sass({
  102. errLogToConsole: true,
  103. includePaths: includePaths,
  104. outputStyle: 'expanded'
  105. }))
  106. .pipe(autoprefixer({
  107. browsers: ['last 2 versions'],
  108. cascade: false
  109. }))
  110. .pipe(gulp.dest(function(file) {
  111. // e.g. wagtailadmin/scss/core.scss -> wagtailadmin/css/core.css
  112. // Changing the suffix is done by Sass automatically
  113. return file.base
  114. .replace('/static_src/', '/static/')
  115. .replace('/scss/', '/css/');
  116. }))
  117. .on('error', gutil.log);
  118. });
  119. /*
  120. * Simple copy tasks - these just copy files from the source to the destination,
  121. * with no compilation, minification, or other intelligence
  122. *
  123. **/
  124. var rename = require('gulp-rename');
  125. var simpleCopyTask = function(glob) {
  126. return function() {
  127. var sources = apps.map(function(app) {
  128. return path.join(app.sourceFiles, app.appName, glob);
  129. });
  130. return gulp.src(sources, {base: '.'})
  131. .pipe(renameSrcToDest())
  132. .pipe(gulp.dest('.'))
  133. .on('error', gutil.log);
  134. };
  135. };
  136. gulp.task('styles:css', simpleCopyTask('css/**/*'));
  137. gulp.task('javascript', simpleCopyTask('js/**/*'));
  138. gulp.task('images', simpleCopyTask('images/**/*'));
  139. gulp.task('fonts', simpleCopyTask('fonts/**/*'));