gulpfile.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. 'use strict';
  2. var gulp = require('gulp');
  3. var babelify = require('babelify');
  4. var browserify = require('browserify');
  5. var buffer = require('vinyl-buffer');
  6. var imageop = require('gulp-image-optimization');
  7. var jshint = require('gulp-jshint');
  8. var less = require('gulp-less');
  9. var minify = require('gulp-minify-css');
  10. var rename = require('gulp-rename');
  11. var source = require('vinyl-source-stream');
  12. var sourcemaps = require('gulp-sourcemaps');
  13. var uglify = require('gulp-uglify');
  14. var glob = require('glob');
  15. var del = require('del');
  16. var misago = '../misago/static/misago/';
  17. // Entry points
  18. gulp.task('watch', ['fastbuild'], function() {
  19. gulp.watch('src/**/*.js', ['fastsource']);
  20. gulp.watch('style/**/*.less', ['faststyle']);
  21. });
  22. // Builds
  23. gulp.task('fastbuild', [
  24. 'fastsource', 'faststyle', 'faststatic', 'fastvendorsources', 'copyvendors'
  25. ]);
  26. gulp.task('build', [
  27. 'source', 'style', 'static', 'vendorsources', 'copyvendors'
  28. ]);
  29. // Source tasks
  30. function getSources() {
  31. var sources = ['src/index.js'];
  32. function include(pattern) {
  33. var paths = glob.sync(pattern);
  34. paths.forEach(function(path) {
  35. sources.push(path);
  36. });
  37. };
  38. include('src/initializers/*.js');
  39. return sources.map(function(path) {
  40. return path;
  41. });
  42. };
  43. gulp.task('lintsource', function() {
  44. return gulp.src('src/**/*.js')
  45. .pipe(jshint())
  46. .pipe(jshint.reporter('default'));
  47. });
  48. gulp.task('fastsource', ['lintsource'], function() {
  49. return browserify({
  50. entries: getSources(),
  51. debug: true
  52. })
  53. .external('moment')
  54. .external('react')
  55. .external('react-dom')
  56. .external('redux')
  57. .external('react-redux')
  58. .transform(babelify)
  59. .bundle()
  60. .pipe(source('misago.js'))
  61. .pipe(buffer())
  62. .pipe(gulp.dest(misago + 'js'));
  63. });
  64. gulp.task('source', ['lintsource'], function() {
  65. process.env.NODE_ENV = 'production';
  66. return browserify({
  67. entries: getSources(),
  68. debug: false
  69. })
  70. .external('moment')
  71. .external('react')
  72. .external('react-dom')
  73. .external('redux')
  74. .external('react-redux')
  75. .transform(babelify)
  76. .bundle()
  77. .pipe(source('misago.js'))
  78. .pipe(buffer())
  79. .pipe(sourcemaps.init())
  80. .pipe(uglify())
  81. .pipe(sourcemaps.write('.'))
  82. .pipe(gulp.dest(misago + 'js'));
  83. });
  84. // Styles tasks
  85. gulp.task('cleanstyle', function(cb) {
  86. del(misago + 'css', cb);
  87. });
  88. gulp.task('faststyle', function() {
  89. return gulp.src('style/index.less')
  90. .pipe(less())
  91. .pipe(rename('misago.css'))
  92. .pipe(gulp.dest(misago + 'css'));
  93. });
  94. gulp.task('style', function() {
  95. return gulp.src('style/index.less')
  96. .pipe(less())
  97. .pipe(minify())
  98. .pipe(rename('misago.css'))
  99. .pipe(gulp.dest(misago + 'css'));
  100. });
  101. // Static tasks
  102. gulp.task('copyfonts', function(cb) {
  103. return gulp.src('static/fonts/**/*')
  104. .pipe(gulp.dest(misago + 'fonts'));
  105. });
  106. gulp.task('fastcopyimages', function() {
  107. return gulp.src('static/img/**/*')
  108. .pipe(gulp.dest(misago + 'img'));
  109. });
  110. gulp.task('copyimages', function() {
  111. return gulp.src('static/img/**/*')
  112. .pipe(imageop({
  113. optimizationLevel: 9
  114. }))
  115. .pipe(gulp.dest(misago + 'img'));
  116. });
  117. gulp.task('faststatic', ['copyfonts', 'fastcopyimages']);
  118. gulp.task('static', ['copyfonts', 'copyimages']);
  119. // Vendor tasks
  120. gulp.task('fastvendorsources', function() {
  121. return browserify({
  122. entries: 'src/vendor.js',
  123. debug: true
  124. })
  125. .transform('browserify-shim')
  126. .require('moment')
  127. .require('react')
  128. .require('react-dom')
  129. .require('redux')
  130. .require('react-redux')
  131. .bundle()
  132. .pipe(source('vendor.js'))
  133. .pipe(buffer())
  134. .pipe(gulp.dest(misago + 'js'));
  135. });
  136. gulp.task('vendorsources', function() {
  137. process.env.NODE_ENV = 'production';
  138. return browserify({
  139. entries: 'src/vendor.js',
  140. debug: false
  141. })
  142. .require('moment')
  143. .require('react')
  144. .require('react-dom')
  145. .require('redux')
  146. .require('react-redux')
  147. .transform(babelify)
  148. .bundle()
  149. .pipe(source('vendor.js'))
  150. .pipe(buffer())
  151. .pipe(sourcemaps.init())
  152. .pipe(uglify())
  153. .pipe(sourcemaps.write('.'))
  154. .pipe(gulp.dest(misago + 'js'));
  155. });
  156. gulp.task('copyvendors', function() {
  157. return gulp.src([
  158. 'zxcvbn/dist/*'
  159. ].map(function(item) {
  160. return 'node_modules/' + item;
  161. }))
  162. .pipe(gulp.dest(misago + 'js'));
  163. });
  164. // Test task
  165. gulp.task('linttests', function() {
  166. return gulp.src(['tests/**/*.js'])
  167. .pipe(jshint())
  168. .pipe(jshint.reporter('default'));
  169. });
  170. gulp.task('test', ['linttests', 'lintsource'], function() {
  171. var mochify = require('mochify');
  172. //mochify('src/test-setup.js tests/**/*.js', {
  173. mochify('src/test-setup.js tests/navbar-dropdown.js', {
  174. reporter: 'spec'
  175. })
  176. .transform(babelify)
  177. .bundle();
  178. });