245 lines
5.9 KiB
JavaScript
245 lines
5.9 KiB
JavaScript
// Setup project
|
|
const hippie = {
|
|
brand: 'hippie',
|
|
jsFile: 'main',
|
|
jsonFile: 'db'
|
|
}
|
|
|
|
// Gulp requirements
|
|
const { watch, series, parallel } = require('gulp');
|
|
const { src, dest } = require('gulp');
|
|
|
|
const fs = require('fs');
|
|
const del = require('del');
|
|
const plumber = require('gulp-plumber');
|
|
// const notify = require('gulp-notify');
|
|
|
|
const nunjucksRender = require('gulp-nunjucks-render');
|
|
const data = require('gulp-data');
|
|
const jsonConcat = require('gulp-json-concat');
|
|
const browserSync = require('browser-sync'), server = browserSync.create();
|
|
const sass = require('gulp-sass');
|
|
const autoprefixer = require('gulp-autoprefixer');
|
|
const sassLint = require('gulp-sass-lint');
|
|
const rename = require('gulp-rename');
|
|
const cleanCss = require('gulp-clean-css');
|
|
const pump = require('pump');
|
|
const cache = require('gulp-cached');
|
|
const remember = require('gulp-remember');
|
|
const concat = require('gulp-concat');
|
|
const uglify = require('gulp-uglify');
|
|
const jshint = require('gulp-jshint');
|
|
const gulpif = require('gulp-if');
|
|
const changed = require('gulp-changed');
|
|
const merge = require('merge-stream');
|
|
// const spritesmith = require('gulp.spritesmith');
|
|
// const buffer = require('vinyl-buffer');
|
|
// const imagemin = require('gulp-imagemin');
|
|
|
|
// Paths to data
|
|
const input = {
|
|
root: 'source',
|
|
screens: 'source/screens/**/*.+(njk|html)',
|
|
templates: 'source/templates',
|
|
data: 'source/data/**/*.json',
|
|
style: 'source/style/**/*.s+(a|c)ss',
|
|
code: ['source/code/hippie/variables.js', 'source/code/hippie/functions.js', 'source/code/hippie/global.js', '!source/vendor/**/*'],
|
|
fonts: 'node_modules/@fortawesome/fontawesome-free/webfonts/**/*',
|
|
art: {
|
|
favicons: 'source/art/favicons/**/*.+(ico|png)',
|
|
sprites: 'source/art/sprites/**/*.png',
|
|
images: 'source/art/images/**/*.+(png|gif|jpg)'
|
|
},
|
|
vendor: 'vendor/**/*',
|
|
demo: {
|
|
data: 'source/templates/demo/data.json'
|
|
}
|
|
};
|
|
|
|
const output = {
|
|
root: 'build',
|
|
screens: 'build/**/*.html',
|
|
data: 'build/json',
|
|
style: 'build/css',
|
|
code: 'build/js',
|
|
fonts: 'build/fonts',
|
|
art: 'build/art',
|
|
reports: 'reports',
|
|
vendor: 'build/vendor'
|
|
};
|
|
|
|
// Create tasks
|
|
|
|
// Clean build folder
|
|
function clean() {
|
|
// You can use multiple globbing patterns as you would with `gulp.src`,
|
|
// for example if you are using del 2.0 or above, return its promise
|
|
return del(output.root +'/**');
|
|
}
|
|
|
|
// Automagically reload browsers
|
|
function reload(done) {
|
|
server.reload();
|
|
|
|
done();
|
|
}
|
|
|
|
// Concatenate JSON files
|
|
function json() {
|
|
return src(input.data)
|
|
.pipe(plumber())
|
|
.pipe(jsonConcat(hippie.jsonFile +'.json', function(data) {
|
|
return new Buffer(JSON.stringify(data));
|
|
}))
|
|
.pipe(dest(output.data));
|
|
}
|
|
|
|
// Transpile HTML
|
|
function nunjucks() {
|
|
return src(input.screens)
|
|
.pipe(plumber())
|
|
.pipe(data(function() {
|
|
let data = JSON.parse(fs.readFileSync(input.demo.data));
|
|
object = {hippie, data};
|
|
return object;
|
|
}))
|
|
.pipe(nunjucksRender({
|
|
path: input.templates,
|
|
envOptions: {
|
|
trimBlocks: true
|
|
}
|
|
}))
|
|
.pipe(dest(output.root));
|
|
}
|
|
|
|
// Serve files to the browser
|
|
function serve(done) {
|
|
server.init({
|
|
index: "demo.html",
|
|
open: false,
|
|
server: output.root
|
|
});
|
|
|
|
done();
|
|
}
|
|
|
|
// This is for the looks
|
|
function style() {
|
|
return src(input.style)
|
|
.pipe(plumber())
|
|
// .pipe(plumbError('STYLE PROBLEM'))
|
|
.pipe(sass({
|
|
includePaths: [input.vendor +'/**/*.s+(a|c)ss']
|
|
}))
|
|
.pipe(autoprefixer(['>= 4%', 'last 2 version']))
|
|
.pipe(dest(output.style))
|
|
.pipe(cleanCss())
|
|
.pipe(rename({
|
|
suffix: '.min'
|
|
}))
|
|
.pipe(dest(output.style));
|
|
}
|
|
// Linting
|
|
function styleLint() {
|
|
var file = fs.createWriteStream(output.reports +'/sass-lint.html');
|
|
var stream = src(input.style)
|
|
.pipe(plumber())
|
|
.pipe(sassLint({
|
|
configFile: '.sasslintrc',
|
|
files: {
|
|
ignore: input.vendor +'/**/*.s+(a|c)ss'
|
|
}
|
|
}))
|
|
.pipe(sassLint.format(file));
|
|
|
|
stream.on('finish', function() {
|
|
file.end();
|
|
});
|
|
|
|
return stream;
|
|
}
|
|
|
|
// Javascript for the win
|
|
function code(cb) {
|
|
pump([
|
|
src(input.code, { sourcemaps: true }),
|
|
cache('code'),
|
|
concat(hippie.jsFile +'.js'),
|
|
dest(output.code),
|
|
uglify(),
|
|
remember('code'),
|
|
rename({
|
|
suffix: '.min'
|
|
}),
|
|
dest(output.code, { sourcemaps: '.' }),
|
|
], cb);
|
|
}
|
|
// Linting
|
|
function codeLint() {
|
|
return src(input.code)
|
|
.pipe(plumber())
|
|
.pipe(jshint())
|
|
.pipe(jshint.reporter('jshint-stylish'))
|
|
.pipe(jshint.reporter('fail', {
|
|
ignoreWarning: true,
|
|
ignoreInfo: true
|
|
}));
|
|
}
|
|
|
|
// Fonts
|
|
function fonts() {
|
|
return src(input.fonts)
|
|
.pipe(plumber())
|
|
.pipe(dest(output.fonts))
|
|
}
|
|
|
|
// Add art
|
|
function art() {
|
|
// Move favicons to the root folder
|
|
let favicons = src(input.art.favicons)
|
|
.pipe(changed(output.art))
|
|
.pipe(dest(output.root))
|
|
|
|
// Assemble sprites
|
|
|
|
// Move images to the root folder
|
|
let images = src(input.art.images)
|
|
.pipe(changed(output.art))
|
|
.pipe(dest(output.art))
|
|
|
|
return merge(favicons, images)
|
|
}
|
|
|
|
// Gather dependencies for tools
|
|
function vendor() {
|
|
return src(input.vendor)
|
|
.pipe(plumber())
|
|
.pipe(dest(output.vendor))
|
|
}
|
|
|
|
function overview() {
|
|
watch([input.screens, input.demo.data], series(nunjucks, reload));
|
|
watch(input.style, series(styleLint, style, reload));
|
|
watch(input.code, series(codeLint, code, reload));
|
|
watch(input.fonts, series(fonts, reload));
|
|
watch([input.art.favicons, input.art.sprites, input.art.images], series(art, reload));
|
|
watch(input.data, series(json, reload));
|
|
}
|
|
|
|
const assets = parallel(fonts, art, json, vendor);
|
|
const build = series(clean, assets, parallel(nunjucks, series(styleLint, style), series(codeLint, code)));
|
|
|
|
exports.lint = parallel(styleLint, codeLint);
|
|
exports.assets = assets;
|
|
exports.build = build;
|
|
exports.default = series(build, serve, overview);
|
|
|
|
// function plumbError(errTitle) {
|
|
// return plumber({
|
|
// errorHandler: notify.onError({
|
|
// // Customizing error title
|
|
// title: errTitle || "GULP GENERAL PROBLEM",
|
|
// message: "<%= error.message %>"
|
|
// })
|
|
// });
|
|
// }
|