gulpfile.js 4.7 KB

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