gulpfile.js 3.8 KB

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