Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ## Globals
  2. var argv         = require('minimist')(process.argv.slice(2));
  3. var autoprefixer = require('gulp-autoprefixer');
  4. var browserSync  = require('browser-sync').create();
  5. var changed      = require('gulp-changed');
  6. var concat       = require('gulp-concat');
  7. var flatten      = require('gulp-flatten');
  8. var gulp         = require('gulp');
  9. var gulpif       = require('gulp-if');
  10. var imagemin     = require('gulp-imagemin');
  11. var jshint       = require('gulp-jshint');
  12. var lazypipe     = require('lazypipe');
  13. var less         = require('gulp-less');
  14. var merge        = require('merge-stream');
  15. var cssNano      = require('gulp-cssnano');
  16. var plumber      = require('gulp-plumber');
  17. var rev          = require('gulp-rev');
  18. var runSequence  = require('run-sequence');
  19. var sass         = require('gulp-sass');
  20. var sourcemaps   = require('gulp-sourcemaps');
  21. var uglify       = require('gulp-uglify');
  22. var browserify2 = require('gulp-browserify2');
  23.  
  24. // ## Globals for Vue component compilation
  25. var babelify   = require('babelify');
  26. var browserify = require('browserify');
  27. var gutil      = require('gutil');
  28. var hmr        = require('browserify-hmr');
  29. var source     = require('vinyl-source-stream');
  30. var buffer     = require('vinyl-buffer');
  31. var vueify     = require('vueify');
  32. var watchify   = require('watchify');
  33. var rollupify  = require('rollupify');
  34.  
  35. // See https://github.com/austinpray/asset-builder
  36. var manifest = require('asset-builder')('./assets/manifest.json');
  37.  
  38. // `path` - Paths to base asset directories. With trailing slashes.
  39. // - `path.source` - Path to the source files. Default: `assets/`
  40. // - `path.dist` - Path to the build directory. Default: `dist/`
  41. var path = manifest.paths;
  42.  
  43. // `config` - Store arbitrary configuration values here.
  44. var config = manifest.config || {};
  45.  
  46. // `globs` - These ultimately end up in their respective `gulp.src`.
  47. // - `globs.js` - Array of asset-builder JS dependency objects. Example:
  48. //   ```
  49. //   {type: 'js', name: 'main.js', globs: []}
  50. //   ```
  51. // - `globs.css` - Array of asset-builder CSS dependency objects. Example:
  52. //   ```
  53. //   {type: 'css', name: 'main.css', globs: []}
  54. //   ```
  55. // - `globs.fonts` - Array of font path globs.
  56. // - `globs.images` - Array of image path globs.
  57. // - `globs.bower` - Array of all the main Bower files.
  58. var globs = manifest.globs;
  59.  
  60. // `project` - paths to first-party assets.
  61. // - `project.js` - Array of first-party JS assets.
  62. // - `project.css` - Array of first-party CSS assets.
  63. var project = manifest.getProjectGlobs();
  64.  
  65. // CLI options
  66. var enabled = {
  67.   // Enable static asset revisioning when `--production`
  68.   rev: argv.production,
  69.   // Disable source maps when `--production`
  70.   maps: !argv.production,
  71.   // Fail styles task on error when `--production`
  72.   failStyleTask: argv.production,
  73.   // Fail due to JSHint warnings only when `--production`
  74.   failJSHint: argv.production,
  75.   // Strip debug statments from javascript when `--production`
  76.   stripJSDebug: argv.production
  77. };
  78.  
  79. // Path to the compiled assets manifest in the dist directory
  80. var revManifest = path.dist + 'assets.json';
  81.  
  82. // ## Reusable Pipelines
  83. // See https://github.com/OverZealous/lazypipe
  84.  
  85. // ### CSS processing pipeline
  86. // Example
  87. // ```
  88. // gulp.src(cssFiles)
  89. //   .pipe(cssTasks('main.css')
  90. //   .pipe(gulp.dest(path.dist + 'styles'))
  91. // ```
  92. var cssTasks = function(filename) {
  93.   return lazypipe()
  94.     .pipe(function() {
  95.       return gulpif(!enabled.failStyleTask, plumber());
  96.     })
  97.     .pipe(function() {
  98.       return gulpif(enabled.maps, sourcemaps.init());
  99.     })
  100.     .pipe(function() {
  101.       return gulpif('*.less', less());
  102.     })
  103.     .pipe(function() {
  104.       return gulpif('*.scss', sass({
  105.         outputStyle: 'nested', // libsass doesn't support expanded yet
  106.         precision: 10,
  107.         includePaths: ['.'],
  108.         errLogToConsole: !enabled.failStyleTask
  109.       }));
  110.     })
  111.     .pipe(concat, filename)
  112.     .pipe(autoprefixer, {
  113.       browsers: [
  114.         'last 2 versions',
  115.         'android 4',
  116.         'opera 12'
  117.       ]
  118.     })
  119.     .pipe(cssNano, {
  120.       safe: true
  121.     })
  122.     // .pipe(function() {
  123.     //   return gulpif(enabled.rev, rev());
  124.     // })
  125.     .pipe(function() {
  126.       return gulpif(enabled.maps, sourcemaps.write('.', {
  127.         sourceRoot: 'assets/styles/'
  128.       }));
  129.     })();
  130. };
  131.  
  132. // ### JS processing pipeline
  133. // Example
  134. // ```
  135. // gulp.src(jsFiles)
  136. //   .pipe(jsTasks('main.js')
  137. //   .pipe(gulp.dest(path.dist + 'scripts'))
  138. // ```
  139. var jsTasks = function(filename) {
  140.  
  141.   return lazypipe()
  142.     .pipe(function() {
  143.       return gulpif(enabled.maps, sourcemaps.init());
  144.     })
  145.     .pipe(browserify2, {
  146.       transform: [vueify, rollupify, babelify.configure({presets:["es2015", "stage-2"]})],
  147.       plugin: [watchify]
  148.     })
  149.     .pipe(concat, filename)
  150.     .pipe(uglify, {
  151.       compress: {
  152.         'drop_debugger': enabled.stripJSDebug
  153.       }
  154.     })
  155.     // .pipe(function() {
  156.     //   return gulpif(enabled.rev, rev());
  157.     // })
  158.     .pipe(function() {
  159.       return gulpif(enabled.maps, sourcemaps.write('.', {
  160.         sourceRoot: 'assets/scripts/'
  161.       }));
  162.     })();
  163. };
  164.  
  165. var jsAppTasks = function(filename) {
  166.   return lazypipe()
  167.     .pipe(function() {
  168.       return gulpif(enabled.maps, sourcemaps.init());
  169.     })
  170.     .pipe(concat, filename)
  171.     .pipe(uglify, {
  172.       compress: {
  173.         'drop_debugger': enabled.stripJSDebug
  174.       }
  175.     })
  176.     // .pipe(function() {
  177.     //   return gulpif(enabled.rev, rev());
  178.     // })
  179.     .pipe(function() {
  180.       return gulpif(enabled.maps, sourcemaps.write('.', {
  181.         sourceRoot: 'assets/app/'
  182.       }));
  183.     })();
  184. };
  185.  
  186. // ### Browserify processing pipeline
  187. // Builds app.js (separate from main.js).
  188. // Filename = string, name of the input file
  189. // Watch = bool, whether or not to use watchify on this build
  190. var buildScript = function(filename, watch) {
  191.   var file = path.source + 'app/' + filename;
  192.  
  193.   // Handle errors in browserify processes.
  194.   var handleErrors = function(err) {
  195.     gutil.log('Compile Error: \n');
  196.     gutil.log(err.message);
  197.     browserSync.notify("Browserify error!");
  198.     this.emit('end');
  199.   };
  200.  
  201.   var props = {
  202.     entries:    [file],
  203.     transform:  [vueify, babelify.configure({presets:["es2015", "stage-2"]})],
  204.     debug:      !argv.production
  205.   };
  206.  
  207.   // Only enable watchify and hot module reloading if 'watch' === true
  208.   var bundler = watch ? watchify(browserify(props).plugin(hmr)) : browserify(props);
  209.  
  210.   function rebundle() {
  211.     var stream = bundler.bundle();
  212.  
  213.     return stream
  214.       .on('error', handleErrors)
  215.       .pipe(source(filename))
  216.       .pipe(buffer())
  217.       .pipe(jsAppTasks(filename))
  218.       .pipe(gulp.dest(path.dist + 'scripts'));
  219.   }
  220.  
  221.   bundler.on('update', function() {
  222.     rebundle();
  223.   });
  224.  
  225.   return rebundle();
  226. };
  227.  
  228. // ### Write to rev manifest
  229. // If there are any revved files then write them to the rev manifest.
  230. // See https://github.com/sindresorhus/gulp-rev
  231. var writeToManifest = function(directory) {
  232.   return lazypipe()
  233.     .pipe(gulp.dest, path.dist + directory)
  234.     .pipe(browserSync.stream, {match: '**/*.{js,css}'})
  235.     .pipe(rev.manifest, revManifest, {
  236.       base: path.dist,
  237.       merge: true
  238.     })
  239.     .pipe(gulp.dest, path.dist)();
  240. };
  241.  
  242. // ## Gulp tasks
  243. // Run `gulp -T` for a task summary
  244.  
  245. // ### Styles
  246. // `gulp styles` - Compiles, combines, and optimizes Bower CSS and project CSS.
  247. // By default this task will only log a warning if a precompiler error is
  248. // raised. If the `--production` flag is set: this task will fail outright.
  249. gulp.task('styles', ['wiredep'], function() {
  250.   var merged = merge();
  251.   manifest.forEachDependency('css', function(dep) {
  252.     var cssTasksInstance = cssTasks(dep.name);
  253.     if (!enabled.failStyleTask) {
  254.       cssTasksInstance.on('error', function(err) {
  255.         console.error(err.message);
  256.         this.emit('end');
  257.       });
  258.     }
  259.     merged.add(gulp.src(dep.globs, {base: 'styles'})
  260.       .pipe(cssTasksInstance));
  261.   });
  262.   return merged
  263.     .pipe(writeToManifest('styles'));
  264. });
  265.  
  266. // ### Scripts
  267. // `gulp scripts` - Runs JSHint then compiles, combines, and optimizes Bower JS
  268. // and project JS.
  269. gulp.task('scripts', ['jshint'], function() {
  270.   var merged = merge();
  271.   manifest.forEachDependency('js', function(dep) {
  272.     merged.add(
  273.       gulp.src(dep.globs, {base: 'scripts'})
  274.         .pipe(jsTasks(dep.name))
  275.     );
  276.   });
  277.   return merged
  278.     .pipe(writeToManifest('scripts'));
  279. });
  280.  
  281. // ### Browserify
  282. // `gulp browserify` - Runs Browserify transforms on app.js.
  283. gulp.task('browserify', function () {
  284.   var built = buildScript('app.js', false);
  285.   return built
  286.     .pipe(writeToManifest('scripts'));
  287. });
  288.  
  289. // ### Fonts
  290. // `gulp fonts` - Grabs all the fonts and outputs them in a flattened directory
  291. // structure. See: https://github.com/armed/gulp-flatten
  292. gulp.task('fonts', function() {
  293.   return gulp.src(globs.fonts)
  294.     .pipe(flatten())
  295.     .pipe(gulp.dest(path.dist + 'fonts'))
  296.     .pipe(browserSync.stream());
  297. });
  298.  
  299. // ### Images
  300. // `gulp images` - Run lossless compression on all the images.
  301. gulp.task('images', function() {
  302.   return gulp.src(globs.images)
  303.     .pipe(imagemin({
  304.       progressive: true,
  305.       interlaced: true,
  306.       svgoPlugins: [{removeUnknownsAndDefaults: false}, {cleanupIDs: false}]
  307.     }))
  308.     .pipe(gulp.dest(path.dist + 'images'))
  309.     .pipe(browserSync.stream());
  310. });
  311.  
  312. // ### JSHint
  313. // `gulp jshint` - Lints configuration JSON and project JS.
  314. gulp.task('jshint', function() {
  315.   return gulp.src([
  316.     'bower.json', 'gulpfile.js'
  317.   ].concat(project.js))
  318.     .pipe(jshint())
  319.     .pipe(jshint.reporter('jshint-stylish'))
  320.     .pipe(gulpif(enabled.failJSHint, jshint.reporter('fail')));
  321. });
  322.  
  323. // ### Clean
  324. // `gulp clean` - Deletes the build folder entirely.
  325. gulp.task('clean', require('del').bind(null, [path.dist]));
  326.  
  327. // ### Watch
  328. // `gulp watch` - Use BrowserSync to proxy your dev server and synchronize code
  329. // changes across devices. Specify the hostname of your dev server at
  330. // `manifest.config.devUrl`. When a modification is made to an asset, run the
  331. // build step for that asset and inject the changes into the page.
  332. // See: http://www.browsersync.io
  333. gulp.task('watch', function() {
  334.   buildScript('app.js', true);
  335.  
  336.   browserSync.init({
  337.     files: ['{lib,templates}/**/*.php', '*.php', '{lib,templates}/**/*.twig', '{lib,templates}/**/**/*.twig', '*.twig'],
  338.     proxy: config.devUrl,
  339.     snippetOptions: {
  340.       whitelist: ['/wp-admin/admin-ajax.php'],
  341.       blacklist: ['/wp-admin/**']
  342.     }
  343.   });
  344.   gulp.watch([path.source + 'styles/**/*'], ['styles']);
  345.   gulp.watch([path.source + 'scripts/**/*'], ['jshint', 'scripts']);
  346.   gulp.watch([path.source + 'fonts/**/*'], ['fonts']);
  347.   gulp.watch([path.source + 'images/**/*'], ['images']);
  348.   gulp.watch(['bower.json', 'assets/manifest.json'], ['build']);
  349. });
  350.  
  351. // ### Build
  352. // `gulp build` - Run all the build tasks but don't clean up beforehand.
  353. // Generally you should be running `gulp` instead of `gulp build`.
  354. gulp.task('build', function(callback) {
  355.   runSequence('styles',
  356.               'scripts',
  357.               'browserify',
  358.               ['fonts', 'images'],
  359.               callback);
  360. });
  361.  
  362. // ### Wiredep
  363. // `gulp wiredep` - Automatically inject Less and Sass Bower dependencies. See
  364. // https://github.com/taptapship/wiredep
  365. gulp.task('wiredep', function() {
  366.   var wiredep = require('wiredep').stream;
  367.   return gulp.src(project.css)
  368.     .pipe(wiredep())
  369.     .pipe(changed(path.source + 'styles', {
  370.       hasChanged: changed.compareSha1Digest
  371.     }))
  372.     .pipe(gulp.dest(path.source + 'styles'));
  373. });
  374.  
  375. // ### Gulp
  376. // `gulp` - Run a complete build. To compile for production run `gulp --production`.
  377. gulp.task('default', ['clean'], function() {
  378.   gulp.start('build');
  379. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement