gulpfile.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. 'use strict';
  2. var fs = require('fs');
  3. var gulp = require('gulp');
  4. var sass = require('gulp-sass');
  5. var cssmin = require('gulp-cssmin');
  6. var mocha = require('gulp-spawn-mocha');
  7. var concat = require('gulp-concat');
  8. var rename = require('gulp-rename');
  9. var jshint = require('gulp-jshint');
  10. var source = require('vinyl-source-stream');
  11. var webpack = require('webpack');
  12. var webpackStream = require('webpack-stream');
  13. var del = require('del');
  14. var stylish = require('jshint-stylish');
  15. var pkg = require('./package.json');
  16. var dirs = {
  17. cssSrc: './resource/css',
  18. cssDist: './public/css',
  19. jsSrc: './resource/js',
  20. jsDist: './public/js',
  21. };
  22. var tests = {
  23. watch: ['test/**/*.test.js'],
  24. }
  25. var css = {
  26. src: dirs.cssSrc + '/' + pkg.name + '.scss',
  27. main: dirs.cssDist + '/crowi-main.css',
  28. dist: dirs.cssDist + '/crowi.css',
  29. revealSrc: dirs.cssSrc + '/' + pkg.name + '-reveal.scss',
  30. revealDist: dirs.cssDist + '/crowi-reveal.css',
  31. watch: ['resource/css/*.scss'],
  32. };
  33. var js = {
  34. bundledSrc: [
  35. 'node_modules/jquery/dist/jquery.js',
  36. 'node_modules/bootstrap-sass/assets/javascripts/bootstrap.js',
  37. 'node_modules/inline-attachment/src/inline-attachment.js',
  38. 'node_modules/jquery.cookie/jquery.cookie.js',
  39. 'resource/thirdparty-js/jquery.selection.js',
  40. ],
  41. src: dirs.jsSrc + '/app.js',
  42. bundled: dirs.jsDist + '/bundled.js',
  43. dist: dirs.jsDist + '/crowi.js',
  44. app: dirs.jsDist + '/app.js',
  45. admin: dirs.jsDist + '/admin.js',
  46. form: dirs.jsDist + '/form.js',
  47. presentation: dirs.jsDist + '/presentation.js',
  48. clientWatch: ['resource/js/**/*.js'],
  49. watch: ['test/**/*.test.js', 'app.js', 'lib/**/*.js'],
  50. lint: ['app.js', 'lib/**/*.js'],
  51. tests: tests.watch,
  52. };
  53. var cssIncludePaths = [
  54. 'node_modules/bootstrap-sass/assets/stylesheets',
  55. 'node_modules/font-awesome/scss',
  56. 'node_modules/reveal.js/css'
  57. ];
  58. gulp.task('js:del', function() {
  59. var fileList = [];
  60. var actualFiles = fs.readdirSync(dirs.jsDist);
  61. fileList = actualFiles.map(function(fn){
  62. if (!fn.match(/.js(on)?$/)) {
  63. return false
  64. }
  65. return dirs.jsDist + '/' + fn;
  66. }).filter(function(v) { return v; });
  67. return del(fileList);
  68. });
  69. gulp.task('js:concat', ['js:del'], function() {
  70. return gulp.src(js.bundledSrc)
  71. .pipe(concat('bundled.js')) // jQuery
  72. .pipe(gulp.dest(dirs.jsDist));
  73. });
  74. // move task for css and js to webpack over time.
  75. gulp.task('webpack', ['js:concat'], function() {
  76. return gulp.src(js.src)
  77. .pipe(webpackStream(
  78. require('./webpack.config.js'),
  79. webpack)) // pass webpack2 to webpack-stream
  80. .pipe(gulp.dest(dirs.jsDist));
  81. });
  82. gulp.task('jshint', function() {
  83. return gulp.src(js.lint)
  84. .pipe(jshint())
  85. .pipe(jshint.reporter(stylish));
  86. });
  87. gulp.task('test', function() {
  88. return gulp.src(js.tests)
  89. .pipe(mocha({
  90. r: 'test/bootstrap.js',
  91. globals: ['chai'],
  92. R: 'dot',
  93. }));
  94. });
  95. gulp.task('css:sass', function() {
  96. gulp.src(css.revealSrc) // reveal
  97. .pipe(sass({
  98. outputStyle: 'nesed',
  99. sourceComments: 'map',
  100. includePaths: cssIncludePaths
  101. }).on('error', sass.logError))
  102. .pipe(gulp.dest(dirs.cssDist));
  103. return gulp.src(css.src)
  104. .pipe(sass({
  105. outputStyle: 'nesed',
  106. sourceComments: 'map',
  107. includePaths: cssIncludePaths
  108. }).on('error', sass.logError))
  109. .pipe(rename({suffix: '-main'})) // create -main.css to prepare concating with highlight.js's css
  110. .pipe(gulp.dest(dirs.cssDist));
  111. });
  112. gulp.task('css:concat', ['css:sass'], function() {
  113. return gulp.src([
  114. css.main,
  115. 'node_modules/highlight.js/styles/tomorrow-night.css',
  116. 'node_modules/diff2html/dist/diff2html.css',
  117. ])
  118. .pipe(concat('crowi.css'))
  119. .pipe(gulp.dest(dirs.cssDist))
  120. });
  121. gulp.task('css:min', ['css:concat'], function() {
  122. gulp.src(css.revealDist)
  123. .pipe(cssmin())
  124. .pipe(rename({suffix: '.min'}))
  125. .pipe(gulp.dest(dirs.cssDist));
  126. return gulp.src(css.dist)
  127. .pipe(cssmin())
  128. .pipe(rename({suffix: '.min'}))
  129. .pipe(gulp.dest(dirs.cssDist));
  130. });
  131. gulp.task('watch', function() {
  132. var watchLogger = function(event) {
  133. console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
  134. };
  135. var cssWatcher = gulp.watch(css.watch, ['css:concat']);
  136. cssWatcher.on('change', watchLogger);
  137. var jsWatcher = gulp.watch(js.clientWatch, ['webpack']);
  138. jsWatcher.on('change', watchLogger);
  139. var testWatcher = gulp.watch(js.watch, ['test']);
  140. testWatcher.on('change', watchLogger);
  141. });
  142. gulp.task('css', ['css:sass', 'css:concat',]);
  143. gulp.task('default', ['css:min', 'webpack', ]);
  144. gulp.task('dev', ['css:concat', 'webpack', 'jshint', 'test']);