gulpfile.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. const del = require('del');
  2. const gulp = require('gulp');
  3. const concat = require('gulp-concat');
  4. const replace = require('gulp-replace');
  5. const merge2 = require('merge2');
  6. const cssnano = require('gulp-cssnano');
  7. const gulpFilter = require('gulp-filter');
  8. const eslint = require('gulp-eslint');
  9. const uglify = require('gulp-uglify');
  10. const svgSprite = require('gulp-svg-sprite');
  11. const definePack = require('define-commonjs/pack/gulp');
  12. const templateCache = require('./scripts/templateCache');
  13. const i18n = require('./scripts/i18n');
  14. const pkg = require('./package.json');
  15. const isProd = process.env.NODE_ENV === 'production';
  16. const paths = {
  17. cache: 'src/cache.js',
  18. manifest: 'src/manifest.json',
  19. templates: [
  20. 'src/**/*.html',
  21. '!src/**/index.html',
  22. ],
  23. jsCollect: [
  24. 'src/**/*.js',
  25. '!src/public/**',
  26. '!src/injected.js',
  27. ],
  28. jsCommon: 'src/common.js',
  29. jsBg: 'src/background/**/*.js',
  30. jsOptions: 'src/options/**/*.js',
  31. jsPopup: 'src/popup/**/*.js',
  32. locales: [
  33. 'src/**/*.js',
  34. 'src/**/*.html',
  35. 'src/**/*.json',
  36. 'src/**/*.yml',
  37. ],
  38. copy: [
  39. 'src/injected.js',
  40. 'src/public/**',
  41. 'src/*/*.html',
  42. 'src/*/*.css',
  43. ],
  44. };
  45. gulp.task('del', () => del(['dist']));
  46. gulp.task('watch', ['build'], () => {
  47. gulp.watch([].concat(paths.cache, paths.templates), ['templates']);
  48. gulp.watch(paths.jsCollect, ['js']);
  49. gulp.watch(paths.copy, ['copy-files']);
  50. gulp.watch(paths.locales, ['copy-i18n']);
  51. });
  52. gulp.task('lint', () => (
  53. gulp.src([
  54. 'src/**/*.js',
  55. '!src/public/**',
  56. ])
  57. .pipe(eslint())
  58. .pipe(eslint.format())
  59. ));
  60. var cacheObj;
  61. var collect;
  62. gulp.task('collect-js', () => {
  63. collect = definePack();
  64. return gulp.src(paths.jsCollect)
  65. .pipe(collect);
  66. });
  67. gulp.task('templates', ['collect-js'], () => {
  68. cacheObj = templateCache('cache');
  69. var stream = merge2([
  70. gulp.src(paths.cache),
  71. gulp.src(paths.templates).pipe(cacheObj),
  72. ])
  73. .pipe(concat('cache.js'))
  74. .pipe(collect.pack(null, file => 'src/cache.js'));
  75. if (isProd) stream = stream.pipe(uglify());
  76. return stream.pipe(gulp.dest('dist'));
  77. });
  78. gulp.task('js-common', ['collect-js'], () => {
  79. var stream = gulp.src(paths.jsCommon)
  80. .pipe(collect.pack());
  81. if (isProd) stream = stream.pipe(uglify());
  82. return stream.pipe(gulp.dest('dist'));
  83. });
  84. gulp.task('js-bg', ['collect-js'], () => {
  85. var stream = gulp.src(paths.jsBg)
  86. .pipe(collect.pack('src/background/app.js'))
  87. .pipe(concat('background/app.js'));
  88. if (isProd) stream = stream.pipe(uglify());
  89. return stream.pipe(gulp.dest('dist'));
  90. });
  91. gulp.task('js-options', ['templates', 'collect-js'], () => {
  92. var stream = gulp.src(paths.jsOptions)
  93. .pipe(cacheObj.replace())
  94. .pipe(collect.pack('src/options/app.js'))
  95. .pipe(concat('options/app.js'));
  96. if (isProd) stream = stream.pipe(uglify());
  97. return stream.pipe(gulp.dest('dist'));
  98. });
  99. gulp.task('js-popup', ['templates', 'collect-js'], () => {
  100. var stream = gulp.src(paths.jsPopup)
  101. .pipe(cacheObj.replace())
  102. .pipe(collect.pack('src/popup/app.js'))
  103. .pipe(concat('popup/app.js'));
  104. if (isProd) stream = stream.pipe(uglify());
  105. return stream.pipe(gulp.dest('dist'))
  106. });
  107. gulp.task('js', [
  108. 'js-common',
  109. 'js-bg',
  110. 'js-options',
  111. 'js-popup',
  112. ]);
  113. gulp.task('manifest', () => (
  114. gulp.src(paths.manifest, {base: 'src'})
  115. .pipe(replace('__VERSION__', pkg.version))
  116. .pipe(gulp.dest('dist'))
  117. ));
  118. gulp.task('copy-files', () => {
  119. const jsFilter = gulpFilter(['**/*.js'], {restore: true});
  120. const cssFilter = gulpFilter(['**/*.css'], {restore: true});
  121. var stream = gulp.src(paths.copy);
  122. if (isProd) stream = stream
  123. .pipe(jsFilter)
  124. .pipe(uglify())
  125. .pipe(jsFilter.restore);
  126. stream = stream
  127. .pipe(cssFilter)
  128. .pipe(cssnano({
  129. zindex: false,
  130. }))
  131. .pipe(cssFilter.restore)
  132. .pipe(gulp.dest('dist/'));
  133. });
  134. gulp.task('copy-i18n', () => (
  135. gulp.src(paths.locales)
  136. .pipe(i18n.extract({
  137. base: 'src',
  138. prefix: '_locales',
  139. touchedOnly: true,
  140. useDefaultLang: true,
  141. markUntouched: false,
  142. extension: '.json',
  143. }))
  144. .pipe(gulp.dest('dist'))
  145. ));
  146. gulp.task('svg', () => (
  147. gulp.src('icons/*.svg')
  148. .pipe(svgSprite({
  149. mode: {
  150. symbol: {
  151. dest: '',
  152. sprite: 'sprite.svg',
  153. },
  154. },
  155. }))
  156. .pipe(gulp.dest('dist/images'))
  157. ));
  158. gulp.task('build', [
  159. 'js',
  160. 'manifest',
  161. 'copy-files',
  162. 'copy-i18n',
  163. 'svg',
  164. ]);
  165. gulp.task('i18n', () => (
  166. gulp.src(paths.locales)
  167. .pipe(i18n.extract({
  168. base: 'src',
  169. prefix: '_locales',
  170. touchedOnly: false,
  171. useDefaultLang: false,
  172. markUntouched: true,
  173. extension: '.yml',
  174. }))
  175. .pipe(gulp.dest('src'))
  176. ));
  177. gulp.task('default', ['build']);