barebones/gulpfile.babel.js

184 lines
4.4 KiB
JavaScript
Raw Normal View History

2017-06-06 16:23:36 +02:00
/* eslint-disable no-console */
import gulp from 'gulp';
import clean from 'gulp-clean';
import sass from 'gulp-sass';
import gulpif from 'gulp-if';
import rename from 'gulp-rename';
import autoprefixer from 'gulp-autoprefixer';
import sourcemaps from 'gulp-sourcemaps';
import { rollup } from 'rollup';
import buble from 'rollup-plugin-buble';
import nodeResolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import json from 'rollup-plugin-json';
import replace from 'rollup-plugin-replace';
import multiEntry from 'rollup-plugin-multi-entry';
import uglify from 'rollup-plugin-uglify';
import { minify } from 'uglify-js';
import imagemin from 'gulp-imagemin';
2017-11-21 18:27:56 +01:00
import notify from 'gulp-notify';
2017-06-06 16:23:36 +02:00
import runSequence from 'run-sequence';
2017-11-21 18:27:56 +01:00
import path from 'path';
2017-06-06 16:23:36 +02:00
const log = console.log;
let production = false;
2017-11-21 18:27:56 +01:00
let error = false;
2017-06-06 16:23:36 +02:00
/**
* Config
*/
const config = {
2017-11-21 18:27:56 +01:00
src: './assets',
public: './',
2017-06-06 16:23:36 +02:00
};
/**
* Tasks - in order
*/
const tasks = ['styles', 'scripts', 'images'];
2017-11-21 18:27:56 +01:00
/**
* Notification
*
* @param {string} message
* @param {string} status
*/
function notification(message = '', status = 'success') {
return gulp.src('./node_modules/gulp-notify/test/fixtures/1.txt')
.pipe(notify({
title: 'Barebones',
message,
icon: path.join(__dirname, `assets/icons/${status}.png`),
}));
}
2017-06-06 16:23:36 +02:00
/**
* Styles
*/
gulp.task('clean-styles', () => (
2017-11-21 18:27:56 +01:00
gulp.src(`${config.public}/css`, {
read: false,
})
.pipe(clean())
2017-06-06 16:23:36 +02:00
));
gulp.task('styles', ['clean-styles'], () => (
2017-11-21 18:27:56 +01:00
gulp.src([`${config.src}/styles/*.scss`])
.pipe(gulpif(!production, sourcemaps.init()))
.pipe(sass({
outputStyle: production ? 'compressed' : 'nested',
}).on('error', (err) => {
notification('Failed to compile styles. 😱', 'error');
log(err.stack);
error = true;
}))
.pipe(autoprefixer({
browsers: ['last 10 versions'],
}))
.pipe(rename({
suffix: '.min',
}))
.pipe(gulpif(!production, sourcemaps.write('.')))
.pipe(gulp.dest(`${config.public}/css`))
2017-06-06 16:23:36 +02:00
));
/**
* Scripts
*/
gulp.task('clean-scripts', () => (
2017-11-21 18:27:56 +01:00
gulp.src(`${config.public}/js`, {
read: false,
})
.pipe(clean())
2017-06-06 16:23:36 +02:00
));
gulp.task('scripts', ['clean-scripts'], () => {
2017-11-21 18:27:56 +01:00
let env = 'development';
if (production) {
env = 'production';
}
2017-06-06 16:23:36 +02:00
2017-11-21 18:27:56 +01:00
rollup({
entry: `${config.src}/scripts/scripts.js`,
plugins: [
multiEntry(),
buble(),
nodeResolve({
browser: true,
main: true,
jsnext: true,
}),
commonjs({
include: [
'node_modules/**',
`${config.src}/**`,
],
}),
json(),
replace({
'process.env.NODE_ENV': JSON.stringify(env),
}),
production ? uglify({}, minify) : '',
2017-06-06 16:23:36 +02:00
],
2017-11-21 18:27:56 +01:00
}).then((bundle) => {
bundle.write({
format: 'iife',
moduleName: 'BarebonesBundle',
sourceMap: !production,
dest: `${config.public}/js/script.min.js`,
});
}).catch(err => {
notification('Failed to compile scripts. 😱', 'error');
log(err.stack);
error = true;
2017-06-06 16:23:36 +02:00
});
});
/**
* Watch
*/
gulp.task('watch-files', tasks, () => {
2017-11-21 18:27:56 +01:00
gulp.watch(`${config.src}/styles/**/*.scss`, ['styles']);
gulp.watch(`${config.src}/scripts/**/*.js`, ['scripts']);
gulp.watch(`${config.src}/images/**/*.*`, ['images']);
2017-06-06 16:23:36 +02:00
});
/**
* Images
*/
gulp.task('images', () => {
2017-11-21 18:27:56 +01:00
// hadle all images that are not svg
gulp.src(`${config.src}/images/**/*.*`)
.pipe(imagemin({
progressive: true,
svgoPlugins: [{
removeViewBox: false,
}],
}))
.pipe(gulp.dest(`${config.public}/img`));
2017-06-06 16:23:36 +02:00
});
/**
* Main Tasks
*/
gulp.task('watch', () => (
2017-11-21 18:27:56 +01:00
runSequence(tasks, 'watch-files', () => {
if (!error) {
notification('Watching files... 👀');
}
})
2017-06-06 16:23:36 +02:00
));
gulp.task('build', () => {
2017-11-21 18:27:56 +01:00
production = true;
runSequence(tasks, () => {
if(!error) {
notification('Build complete! 🍻');
}
});
2017-06-06 16:23:36 +02:00
});
gulp.task('default', () => (
2017-11-21 18:27:56 +01:00
runSequence(tasks)
2017-06-06 16:23:36 +02:00
));