UNPKG

stacked-menu

Version:

A flexible stacked navigation menu.

232 lines (208 loc) 5.73 kB
const gulp = require('gulp') const browserSync = require('browser-sync').create() const reload = browserSync.reload const del = require('del') const rename = require('gulp-rename') const sass = require('gulp-sass') const postcss = require('gulp-postcss') const cssnano = require('cssnano') const autoprefixer = require('autoprefixer') const sorter = require('css-declaration-sorter') const sourcemaps = require('gulp-sourcemaps') const rollup = require('gulp-better-rollup') const buble = require('rollup-plugin-buble') const eslint = require('rollup-plugin-eslint') const uglify = require('rollup-plugin-uglify-es') const cleanup = require('rollup-plugin-cleanup') const zip = require('gulp-zip') const pkg = require('./package.json') const processors = [ autoprefixer({ browsers: [ 'Chrome >= 20', 'Firefox >= 24', 'Edge >= 12', 'Explorer >= 9', 'iOS >= 6', 'Safari >= 6', 'Android 2.3', 'Android >= 4', 'Opera >= 12' ] }), sorter({order: 'concentric-css'}) ] const nano = [ cssnano({ discardComments: { removeAll: true }, zindex:false }) ] const snakeToCap = function(str) { return str.replace(/\-\w/g, function(sub) { return sub[1].toUpperCase() }) .replace(str.charAt(0), str.charAt(0).toUpperCase()) } const banner = '/**' + '\n* ' + snakeToCap(pkg.name) + ' v' + pkg.version + '\n* ' + pkg.description + '\n* Author: ' + pkg.author + '\n*' + '\n* ' + pkg.homepage + '\n*' + '\n* Copyright ' + pkg.license + '\n**/\n' const footer = '/* Touch me on Twitter! @stilearningTwit */' /** * Builds * ================================================================ */ // Compile sass into CSS & auto-inject into browsers gulp.task('sass', () => gulp.src('src/scss/' + pkg.name + '.scss') .pipe(sourcemaps.init()) .pipe(sass()) .pipe(postcss(processors)) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('dist/css')) .pipe(browserSync.stream({match: '**/*.css'})) ) gulp.task('sass-uglify', () => gulp.src('src/scss/' + pkg.name + '.scss') .pipe(sourcemaps.init()) .pipe(sass()) .pipe(postcss(processors)) .pipe(postcss(nano)) .pipe(rename({suffix: '.min'})) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('dist/css')) .pipe(browserSync.stream({match: '**/*.css'})) ) gulp.task('sassDemo', () => gulp.src('demo/assets/scss/*.scss') .pipe(sourcemaps.init()) .pipe(sass()) .pipe(postcss(processors)) .pipe(postcss(nano)) .pipe(rename({suffix: '.min'})) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('demo/assets/css')) .pipe(browserSync.stream({match: '**/*.css'})) ) // process JS files. gulp.task('js', () => gulp.src(`src/scripts/${pkg.name}.js`) .pipe(sourcemaps.init()) .pipe(rollup({ plugins: [ eslint(), buble(), cleanup({ comments: ['srcmaps'], normalizeEols: 'unix', maxEmptyLines: 1 }) ] }, { format: 'iife', name: snakeToCap(pkg.name), banner: banner, footer: footer, sourceMap: true })) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('dist/js')) ) gulp.task('js-uglify', () => gulp.src(`src/scripts/${pkg.name}.js`) .pipe(sourcemaps.init()) .pipe(rollup({ plugins: [ eslint(), buble(), uglify({ output: {quote_style: 1} }) ] }, { format: 'iife', name: snakeToCap(pkg.name), banner: banner, footer: footer, sourceMap: true })) .pipe(rename({suffix: '.min'})) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('dist/js')) ) // Copy assets gulp.task('copy', (done) => { const bridges = 'src/scripts/' + pkg.name + '.jquery.js' // dist gulp.src('src/scss/*.scss') .pipe(gulp.dest('dist/scss')) gulp.src(bridges) .pipe(gulp.dest('dist/js')) // demo gulp.src([ bridges, 'dist/js/*' ]) .pipe(gulp.dest('demo/assets/js')) gulp.src('dist/css/*') .pipe(gulp.dest('demo/assets/css')) done() }) // Clean up build files gulp.task('clean', del.bind(null, [ `releases/${pkg.name}-v${pkg.version}.zip`, 'dist', 'demo/assets/css', 'demo/assets/js/**', '!demo/assets/js', '!demo/assets/js/demo.js' ]) ) gulp.task('build', gulp.series('sass', 'sass-uglify', 'sassDemo', 'js', 'js-uglify', 'copy')) gulp.task('tag', () => gulp.src([ 'README.md', 'CHANGELOG.md', 'demo/**/*', 'dist/**/*', 'docs/' + pkg.name + '/' + pkg.version + '/**/*' ], { base: '.' }) .pipe(zip(pkg.name + '-v' + pkg.version + '.zip')) .pipe(gulp.dest('releases/')) ) gulp.task('release', gulp.series('build', 'tag')) // Static Server + watching scss/html files gulp.task('serve', (done) => { browserSync.init({ server: './demo', port: 3002 }) done() gulp.watch('src/scss/*.scss', gulp.series('sass', 'sass-uglify', 'sassDemo', 'copy')) gulp.watch('demo/assets/scss/*.scss', gulp.series('sassDemo')) // add browserSync.reload to the tasks array to make // all browsers reload after tasks are complete. gulp.watch([ 'src/scripts/*.js', 'demo/assets/js/demo.js' ], gulp.series('copy', 'js', 'js-uglify', reload)) gulp.watch('demo/*.html').on('change', reload) }) // Serve the docs gulp.task('serve:docs', () => browserSync.init({ server: './docs/' + pkg.name + '/' + pkg.version, port: 5002 }) ) gulp.task('serve:release', gulp.series('release', 'serve')) gulp.task('default', gulp.series('build', 'serve'))