gulpfile.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. 'use strict';
  2. var gulp = require('gulp');
  3. var gutil = require('gulp-util');
  4. var babelify = require('babelify');
  5. var browserify = require('browserify');
  6. var buffer = require('vinyl-buffer');
  7. var imageop = require('gulp-image-optimization');
  8. var jshint = require('gulp-jshint');
  9. var less = require('gulp-less');
  10. var minify = require('gulp-minify-css');
  11. var rename = require('gulp-rename');
  12. var source = require('vinyl-source-stream');
  13. var sourcemaps = require('gulp-sourcemaps');
  14. var uglify = require('gulp-uglify');
  15. var watchify = require('watchify');
  16. var fs = require('fs');
  17. var glob = require('glob');
  18. var del = require('del');
  19. var misago = '../misago/static/misago/';
  20. // Entry points
  21. gulp.task('watch', ['watchifybuild'], function() {
  22. gulp.watch('style/**/*.less', ['faststyle']);
  23. });
  24. gulp.task('watchstyle', ['faststyle', 'faststatic'], function() {
  25. gulp.watch('style/**/*.less', ['faststyle']);
  26. });
  27. // Builds
  28. gulp.task('fastbuild', [
  29. 'fastsource',
  30. 'faststyle',
  31. 'faststatic',
  32. 'fastvendorsources',
  33. 'copyzxcvbn'
  34. ]);
  35. gulp.task('build', [
  36. 'source',
  37. 'style',
  38. 'static',
  39. 'vendorsources',
  40. 'copyzxcvbn'
  41. ]);
  42. // Source tasks
  43. function getSources() {
  44. var sources = ['src/index.js'];
  45. function include(pattern) {
  46. var paths = glob.sync(pattern);
  47. paths.forEach(function(path) {
  48. sources.push(path);
  49. });
  50. };
  51. include('src/initializers/*.js');
  52. include('src/initializers/**/*.js');
  53. return sources.map(function(path) {
  54. return path;
  55. });
  56. };
  57. gulp.task('lintsource', function() {
  58. return gulp.src('src/**/*.js')
  59. .pipe(jshint())
  60. .pipe(jshint.reporter('default'));
  61. });
  62. gulp.task('fastsource', ['lintsource'], function() {
  63. return browserify({
  64. entries: getSources(),
  65. debug: true,
  66. })
  67. .external('moment')
  68. .external('cropit')
  69. .external('react')
  70. .external('react-dom')
  71. .external('react-router')
  72. .external('redux')
  73. .external('react-redux')
  74. .transform(babelify)
  75. .bundle()
  76. .pipe(source('misago.js'))
  77. .pipe(buffer())
  78. .pipe(gulp.dest(misago + 'js'));
  79. });
  80. gulp.task('watchifybuild', ['fastbuild'], function() {
  81. var b = browserify({
  82. entries: getSources(),
  83. debug: true,
  84. cache: {},
  85. packageCache: {}
  86. })
  87. .plugin(watchify, {
  88. delay: 100,
  89. poll: true
  90. })
  91. .external('moment')
  92. .external('cropit')
  93. .external('react')
  94. .external('react-dom')
  95. .external('react-router')
  96. .external('redux')
  97. .external('react-redux')
  98. .transform(babelify)
  99. .on('error', function(err){
  100. // print the error (can replace with gulp-util)
  101. console.log(err.message);
  102. // end this stream
  103. this.emit('end');
  104. });
  105. function bundle() {
  106. b.bundle().pipe(fs.createWriteStream(misago + 'js/misago.js'));
  107. }
  108. b.on('update', bundle);
  109. bundle();
  110. b.on('log', function (msg) {
  111. gutil.log(gutil.colors.cyan('watchify:'), msg);
  112. });
  113. })
  114. gulp.task('source', ['lintsource'], function() {
  115. process.env.NODE_ENV = 'production';
  116. return browserify({
  117. entries: getSources(),
  118. debug: false
  119. })
  120. .external('moment')
  121. .external('cropit')
  122. .external('react')
  123. .external('react-dom')
  124. .external('react-router')
  125. .external('redux')
  126. .external('react-redux')
  127. .transform(babelify)
  128. .bundle()
  129. .pipe(source('misago.js'))
  130. .pipe(buffer())
  131. .pipe(sourcemaps.init())
  132. .pipe(uglify())
  133. .pipe(sourcemaps.write('.'))
  134. .pipe(gulp.dest(misago + 'js'));
  135. });
  136. // Styles tasks
  137. gulp.task('cleanstyle', function(cb) {
  138. del(misago + 'css', cb);
  139. });
  140. gulp.task('faststyle', function() {
  141. return gulp.src('style/index.less')
  142. .pipe(less())
  143. .pipe(rename('misago.css'))
  144. .pipe(gulp.dest(misago + 'css'));
  145. });
  146. gulp.task('style', function() {
  147. return gulp.src('style/index.less')
  148. .pipe(less())
  149. .pipe(minify())
  150. .pipe(rename('misago.css'))
  151. .pipe(gulp.dest(misago + 'css'));
  152. });
  153. // Static tasks
  154. gulp.task('copyfonts', function(cb) {
  155. return gulp.src('static/fonts/**/*')
  156. .pipe(gulp.dest(misago + 'fonts'));
  157. });
  158. gulp.task('fastcopyimages', function() {
  159. return gulp.src('static/img/**/*')
  160. .pipe(gulp.dest(misago + 'img'));
  161. });
  162. gulp.task('copyimages', function() {
  163. return gulp.src('static/img/**/*')
  164. .pipe(imageop({
  165. optimizationLevel: 9
  166. }))
  167. .pipe(gulp.dest(misago + 'img'));
  168. });
  169. gulp.task('faststatic', ['copyfonts', 'fastcopyimages']);
  170. gulp.task('static', ['copyfonts', 'copyimages']);
  171. // Vendor tasks
  172. gulp.task('fastvendorsources', function() {
  173. return browserify({
  174. entries: 'src/vendor.js',
  175. debug: true
  176. })
  177. .transform('browserify-shim')
  178. .require('moment')
  179. .require('cropit')
  180. .require('react')
  181. .require('react-dom')
  182. .require('react-router')
  183. .require('redux')
  184. .require('react-redux')
  185. .bundle()
  186. .pipe(source('vendor.js'))
  187. .pipe(buffer())
  188. .pipe(gulp.dest(misago + 'js'));
  189. });
  190. gulp.task('vendorsources', function() {
  191. process.env.NODE_ENV = 'production';
  192. return browserify({
  193. entries: 'src/vendor.js',
  194. debug: false
  195. })
  196. .transform('browserify-shim')
  197. .require('moment')
  198. .require('cropit')
  199. .require('react')
  200. .require('react-dom')
  201. .require('react-router')
  202. .require('redux')
  203. .require('react-redux')
  204. .transform(babelify)
  205. .bundle()
  206. .pipe(source('vendor.js'))
  207. .pipe(buffer())
  208. .pipe(sourcemaps.init())
  209. .pipe(uglify())
  210. .pipe(sourcemaps.write('.'))
  211. .pipe(gulp.dest(misago + 'js'));
  212. });
  213. gulp.task('copyzxcvbn', function() {
  214. return gulp.src('node_modules/zxcvbn/dist/*')
  215. .pipe(gulp.dest(misago + 'js'));
  216. });
  217. // Test task
  218. var tests = (function() {
  219. var flag = process.argv.indexOf('--limit');
  220. var value = process.argv[flag + 1];
  221. var tests = ['src/test-setup.js'];
  222. if (flag !== -1 && value) {
  223. var pattern = value.trim();
  224. glob.sync('tests/**/*.js').map(function(path) {
  225. if (path.indexOf(pattern) !== -1) {
  226. tests.push(path);
  227. }
  228. });
  229. } else {
  230. tests.push('tests/**/*.js');
  231. }
  232. return tests;
  233. })();
  234. gulp.task('linttests', function() {
  235. return gulp.src(tests)
  236. .pipe(jshint())
  237. .pipe(jshint.reporter('default'));
  238. });
  239. gulp.task('test', ['linttests', 'lintsource'], function() {
  240. var mochify = require('mochify');
  241. mochify(tests.join(" "), {
  242. reporter: 'spec'
  243. })
  244. .transform(babelify)
  245. .bundle();
  246. });