gulpfile.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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 eslint = require('gulp-eslint');
  8. var image = require('gulp-image');
  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. 'copypolyfill',
  34. 'copyzxcvbn'
  35. ]);
  36. gulp.task('build', [
  37. 'source',
  38. 'style',
  39. 'static',
  40. 'vendorsources',
  41. 'copypolyfill',
  42. 'copyzxcvbn'
  43. ]);
  44. // Source tasks
  45. function getSources() {
  46. var sources = ['src/index.js'];
  47. function include(pattern) {
  48. var paths = glob.sync(pattern);
  49. paths.forEach(function(path) {
  50. sources.push(path);
  51. });
  52. };
  53. include('src/initializers/*.js');
  54. include('src/initializers/**/*.js');
  55. return sources.map(function(path) {
  56. return path;
  57. });
  58. };
  59. gulp.task('lintsource', function() {
  60. return gulp.src('src/**/*.js')
  61. .pipe(eslint({
  62. 'parser': 'babel-eslint',
  63. 'parserOptions': {
  64. 'ecmaVersion': 7,
  65. 'sourceType': 'module',
  66. 'ecmaFeatures': {
  67. 'jsx': true
  68. }
  69. },
  70. rules: {
  71. "semi": ["error", "never"],
  72. "no-undef": "error",
  73. "strict": 2
  74. },
  75. globals: [
  76. "gettext",
  77. "ngettext",
  78. "interpolate",
  79. "misago",
  80. "hljs"
  81. ],
  82. envs: [
  83. "browser",
  84. "jquery",
  85. "node",
  86. "es6"
  87. ]
  88. }))
  89. .pipe(eslint.format());
  90. });
  91. gulp.task('fastsource', ['lintsource'], function() {
  92. process.env.NODE_ENV = 'development';
  93. return browserify({
  94. entries: getSources(),
  95. debug: true,
  96. })
  97. .external('moment')
  98. .external('cropit')
  99. .external('react')
  100. .external('react-dom')
  101. .external('react-router')
  102. .external('redux')
  103. .external('react-redux')
  104. .transform(babelify)
  105. .bundle()
  106. .pipe(source('misago.js'))
  107. .pipe(buffer())
  108. .pipe(gulp.dest(misago + 'js'));
  109. });
  110. gulp.task('watchifybuild', ['fastbuild'], function() {
  111. process.env.NODE_ENV = 'development';
  112. var b = browserify({
  113. entries: getSources(),
  114. debug: true,
  115. cache: {},
  116. packageCache: {}
  117. })
  118. .plugin(watchify, {
  119. delay: 100,
  120. poll: true
  121. })
  122. .external('moment')
  123. .external('cropit')
  124. .external('react')
  125. .external('react-dom')
  126. .external('react-router')
  127. .external('redux')
  128. .external('react-redux')
  129. .transform(babelify)
  130. .on('error', function(err) {
  131. gutil.log(gutil.colors.red(err.toString() + '\n' + err.codeFrame));
  132. this.emit('end');
  133. });
  134. function bundle() {
  135. b.bundle()
  136. .on('error', function(err) {
  137. gutil.log(gutil.colors.red(err.toString() + '\n' + err.codeFrame));
  138. this.emit('end');
  139. })
  140. .pipe(fs.createWriteStream(misago + 'js/misago.js'));
  141. }
  142. b.on('update', bundle);
  143. bundle();
  144. b.on('log', function (msg) {
  145. gutil.log(gutil.colors.cyan('watchify:'), msg);
  146. });
  147. })
  148. gulp.task('source', ['lintsource'], function() {
  149. process.env.NODE_ENV = 'production';
  150. return browserify({
  151. entries: getSources(),
  152. debug: false
  153. })
  154. .external('moment')
  155. .external('cropit')
  156. .external('react')
  157. .external('react-dom')
  158. .external('react-router')
  159. .external('redux')
  160. .external('react-redux')
  161. .transform(babelify)
  162. .bundle()
  163. .pipe(source('misago.js'))
  164. .pipe(buffer())
  165. .pipe(sourcemaps.init())
  166. .pipe(uglify())
  167. .pipe(sourcemaps.write('.'))
  168. .pipe(gulp.dest(misago + 'js'));
  169. });
  170. // Styles tasks
  171. gulp.task('cleanstyle', function(cb) {
  172. del(misago + 'css', cb);
  173. });
  174. gulp.task('faststyle', function() {
  175. return gulp.src('style/index.less')
  176. .pipe(less().on('error', function(err) {
  177. gutil.log(gutil.colors.red(err.toString()));
  178. this.emit('end');
  179. }))
  180. .pipe(rename('misago.css'))
  181. .pipe(gulp.dest(misago + 'css'));
  182. });
  183. gulp.task('style', function() {
  184. return gulp.src('style/index.less')
  185. .pipe(less())
  186. .pipe(minify())
  187. .pipe(rename('misago.css'))
  188. .pipe(gulp.dest(misago + 'css'));
  189. });
  190. // Static tasks
  191. gulp.task('copyfonts', function(cb) {
  192. return gulp.src('static/fonts/**/*')
  193. .pipe(gulp.dest(misago + 'fonts'));
  194. });
  195. gulp.task('fastcopyimages', function() {
  196. return gulp.src('static/img/**/*')
  197. .pipe(gulp.dest(misago + 'img'));
  198. });
  199. gulp.task('copyimages', function() {
  200. return gulp.src('static/img/**/*')
  201. .pipe(image())
  202. .pipe(gulp.dest(misago + 'img'));
  203. });
  204. gulp.task('faststatic', ['copyfonts', 'fastcopyimages']);
  205. gulp.task('static', ['copyfonts', 'copyimages']);
  206. // Vendor tasks
  207. gulp.task('fastvendorsources', function() {
  208. process.env.NODE_ENV = 'development';
  209. return browserify({
  210. entries: 'src/vendor.js',
  211. debug: true
  212. })
  213. .transform('browserify-shim')
  214. .require('moment')
  215. .require('cropit')
  216. .require('react')
  217. .require('react-dom')
  218. .require('react-router')
  219. .require('redux')
  220. .require('react-redux')
  221. .bundle()
  222. .pipe(source('vendor.js'))
  223. .pipe(buffer())
  224. .pipe(gulp.dest(misago + 'js'));
  225. });
  226. gulp.task('vendorsources', function() {
  227. process.env.NODE_ENV = 'production';
  228. return browserify({
  229. entries: 'src/vendor.js',
  230. debug: false
  231. })
  232. .transform('browserify-shim')
  233. .require('moment')
  234. .require('cropit')
  235. .require('react')
  236. .require('react-dom')
  237. .require('react-router')
  238. .require('redux')
  239. .require('react-redux')
  240. .transform(babelify)
  241. .bundle()
  242. .pipe(source('vendor.js'))
  243. .pipe(buffer())
  244. .pipe(sourcemaps.init())
  245. .pipe(uglify())
  246. .pipe(sourcemaps.write('.'))
  247. .pipe(gulp.dest(misago + 'js'));
  248. });
  249. gulp.task('copyzxcvbn', function() {
  250. return gulp.src('node_modules/zxcvbn/dist/*')
  251. .pipe(gulp.dest(misago + 'js'));
  252. });
  253. gulp.task('copypolyfill', function() {
  254. return gulp.src('node_modules/babel-polyfill/dist/polyfill.js')
  255. .pipe(rename('es2015.js'))
  256. .pipe(buffer())
  257. .pipe(sourcemaps.init())
  258. .pipe(uglify())
  259. .pipe(sourcemaps.write('.'))
  260. .pipe(gulp.dest(misago + 'js'));
  261. });