/** * Gulp Packages */ // General var gulp = require('gulp'); var fs = require('fs'); var del = require('del'); var lazypipe = require('lazypipe'); var plumber = require('gulp-plumber'); var flatten = require('gulp-flatten'); var tap = require('gulp-tap'); var rename = require('gulp-rename'); var header = require('gulp-header'); var footer = require('gulp-footer'); var watch = require('gulp-watch'); var livereload = require('gulp-livereload'); var package = require('./package.json'); // Scripts and tests var jshint = require('gulp-jshint'); var stylish = require('jshint-stylish'); var concat = require('gulp-concat'); var uglify = require('gulp-uglify'); var karma = require('gulp-karma'); // Styles var sass = require('gulp-sass'); var prefix = require('gulp-autoprefixer'); var minify = require('gulp-minify-css'); // SVGs var svgmin = require('gulp-svgmin'); var svgstore = require('gulp-svgstore'); // Docs var markdown = require('gulp-markdown'); var fileinclude = require('gulp-file-include'); /** * Paths to project folders */ var paths = { input: 'src/**/*', output: 'dist/', scripts: { input: 'src/js/*', output: 'dist/js/' }, styles: { input: 'src/sass/**/*.{scss,sass}', output: 'dist/css/' }, svgs: { input: 'src/svg/*', output: 'dist/svg/' }, static: 'src/static/**', test: { input: 'src/js/**/*.js', karma: 'test/karma.conf.js', spec: 'test/spec/**/*.js', coverage: 'test/coverage/', results: 'test/results/' }, docs: { input: 'src/docs/*.{html,md,markdown}', output: 'docs/', templates: 'src/docs/_templates/', assets: 'src/docs/assets/**' } }; /** * Template for banner to add to file headers */ var banner = { full : '/**\n' + ' * <%= package.name %> v<%= package.version %>\n' + ' * <%= package.description %>, by <%= package.author.name %>.\n' + ' * <%= package.repository.url %>\n' + ' * \n' + ' * Free to use under the MIT License.\n' + ' * http://gomakethings.com/mit/\n' + ' */\n\n', min : '/**' + ' <%= package.name %> v<%= package.version %>, by Chris Ferdinandi' + ' | <%= package.repository.url %>' + ' | Licensed under MIT: http://gomakethings.com/mit/' + ' */\n' }; /** * Gulp Taks */ // Lint, minify, and concatenate scripts gulp.task('build:scripts', ['clean:dist'], function() { var jsTasks = lazypipe() .pipe(header, banner.full, { package : package }) .pipe(gulp.dest, paths.scripts.output) .pipe(rename, { suffix: '.min' }) .pipe(uglify) .pipe(header, banner.min, { package : package }) .pipe(gulp.dest, paths.scripts.output); return gulp.src(paths.scripts.input) .pipe(plumber()) .pipe(tap(function (file, t) { if ( file.isDirectory() ) { var name = file.relative + '.js'; return gulp.src(file.path + '/*.js') .pipe(concat(name)) .pipe(jsTasks()); } })) .pipe(jsTasks()); }); // Process, lint, and minify Sass files gulp.task('build:styles', ['clean:dist'], function() { return gulp.src(paths.styles.input) .pipe(plumber()) .pipe(sass({ outputStyle: 'expanded', sourceComments: true })) .pipe(flatten()) .pipe(prefix({ browsers: ['last 2 version', '> 1%'], cascade: true, remove: true })) .pipe(header(banner.full, { package : package })) .pipe(gulp.dest(paths.styles.output)) .pipe(rename({ suffix: '.min' })) .pipe(minify()) .pipe(header(banner.min, { package : package })) .pipe(gulp.dest(paths.styles.output)); }); // Generate SVG sprites gulp.task('build:svgs', ['clean:dist'], function () { return gulp.src(paths.svgs.input) .pipe(plumber()) .pipe(tap(function (file, t) { if ( file.isDirectory() ) { var name = file.relative + '.svg'; return gulp.src(file.path + '/*.svg') .pipe(svgmin()) .pipe(svgstore({ fileName: name, prefix: 'icon-', inlineSvg: true })) .pipe(gulp.dest(paths.svgs.output)); } })) .pipe(svgmin()) .pipe(svgstore({ fileName: 'icons.svg', prefix: 'icon-', inlineSvg: true })) .pipe(gulp.dest(paths.svgs.output)); }); // Copy static files into output folder gulp.task('copy:static', ['clean:dist'], function() { return gulp.src(paths.static) .pipe(plumber()) .pipe(gulp.dest(paths.output)); }); // Lint scripts gulp.task('lint:scripts', function () { return gulp.src(paths.scripts.input) .pipe(plumber()) .pipe(jshint()) .pipe(jshint.reporter('jshint-stylish')); }); // Remove prexisting content from output and test folders gulp.task('clean:dist', function () { del.sync([ paths.output, paths.test.coverage, paths.test.results ]); }); // Run unit tests gulp.task('test:scripts', function() { return gulp.src([paths.test.input].concat([paths.test.spec])) .pipe(plumber()) .pipe(karma({ configFile: paths.test.karma })) .on('error', function(err) { throw err; }); }); // Generate documentation gulp.task('build:docs', ['compile', 'clean:docs'], function() { return gulp.src(paths.docs.input) .pipe(plumber()) .pipe(fileinclude({ prefix: '@@', basepath: '@file' })) .pipe(tap(function (file, t) { if ( /\.md|\.markdown/.test(file.path) ) { return t.through(markdown); } })) .pipe(header(fs.readFileSync(paths.docs.templates + '/_header.html', 'utf8'))) .pipe(footer(fs.readFileSync(paths.docs.templates + '/_footer.html', 'utf8'))) .pipe(gulp.dest(paths.docs.output)); }); // Copy distribution files to docs gulp.task('copy:dist', ['compile', 'clean:docs'], function() { return gulp.src(paths.output + '/**') .pipe(plumber()) .pipe(gulp.dest(paths.docs.output + '/dist')); }); // Copy documentation assets to docs gulp.task('copy:assets', ['clean:docs'], function() { return gulp.src(paths.docs.assets) .pipe(plumber()) .pipe(gulp.dest(paths.docs.output + '/assets')); }); // Remove prexisting content from docs folder gulp.task('clean:docs', function () { return del.sync(paths.docs.output); }); // Spin up livereload server and listen for file changes gulp.task('listen', function () { livereload.listen(); gulp.watch(paths.input).on('change', function(file) { gulp.start('default'); gulp.start('refresh'); }); }); // Run livereload after file change gulp.task('refresh', ['compile', 'docs'], function () { livereload.changed(); }); /** * Task Runners */ // Compile files gulp.task('compile', [ 'lint:scripts', 'clean:dist', 'copy:static', 'build:scripts', 'build:svgs', 'build:styles' ]); // Generate documentation gulp.task('docs', [ 'clean:docs', 'build:docs', 'copy:dist', 'copy:assets' ]); // Generate documentation gulp.task('tests', [ 'test:scripts' ]); // Compile files, generate docs, and run unit tests (default) gulp.task('default', [ 'compile', 'docs', 'tests' ]); // Compile files, generate docs, and run unit tests when something changes gulp.task('watch', [ 'listen', 'default' ]);