diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..1d175f79 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,89 @@ +const {series, parallel, watch, src, dest} = require('gulp'); +const pump = require('pump'); + +// gulp plugins and utils +const livereload = require('gulp-livereload'); +const postcss = require('gulp-postcss'); +const concat = require('gulp-concat'); +const uglify = require('gulp-uglify'); +const beeper = require('beeper'); +const zip = require('gulp-zip'); + +// postcss plugins +const easyimport = require('postcss-easy-import'); +const autoprefixer = require('autoprefixer'); +const cssnano = require('cssnano'); + +function serve(done) { + livereload.listen(); + done(); +} + +function handleError(done) { + return function (err) { + if (err) { + beeper(); + } + return done(err); + }; +}; + +function hbs(done) { + pump([ + src(['*.hbs', 'partials/**/*.hbs']), + livereload() + ], handleError(done)); +} + +function css(done) { + pump([ + src('assets/css/screen.css', {sourcemaps: true}), + postcss([ + easyimport, + autoprefixer(), + cssnano() + ]), + dest('assets/built/', {sourcemaps: '.'}), + livereload() + ], handleError(done)); +} + +function js(done) { + pump([ + src([ + 'node_modules/@tryghost/shared-theme-assets/assets/js/lib/**/*.js', + 'node_modules/@tryghost/shared-theme-assets/assets/js/main.js', + 'assets/js/lib/*.js', + 'assets/js/main.js' + ], {sourcemaps: true}), + concat('main.min.js'), + uglify(), + dest('assets/built/', {sourcemaps: '.'}), + livereload() + ], handleError(done)); +} + +function zipper(done) { + const filename = require('./package.json').name + '.zip'; + + pump([ + src([ + '**', + '!node_modules', '!node_modules/**', + '!dist', '!dist/**', + '!yarn-error.log' + ]), + zip(filename), + dest('dist/') + ], handleError(done)); +} + +const hbsWatcher = () => watch(['*.hbs', 'partials/**/*.hbs'], hbs); +const cssWatcher = () => watch('assets/css/**/*.css', css); +const jsWatcher = () => watch('assets/js/**/*.js', js); +const watcher = parallel(hbsWatcher, cssWatcher, jsWatcher); +const build = series(css, js); + +exports.build = build; +exports.zip = series(build, zipper); +exports.default = series(build, serve, watcher);