-
Sebastian Castro authoredSebastian Castro authored
gulpfile.js 5.69 KiB
const gulp = require('gulp'),
merge = require('merge-stream'),
sass = require('gulp-sass'),
minifycss = require('gulp-minify-css'),
uglify = require('gulp-uglify'),
concat = require('gulp-concat'),
gzip = require('gulp-gzip'),
del = require('del'),
yaml = require('gulp-yaml'),
header = require('gulp-header'),
footer = require('gulp-footer'),
workboxBuild = require('workbox-build'),
tap = require('gulp-tap'),
log = require('fancy-log');
const scriptsHome = () =>
gulp.src(['assets/js/home.js'])
.pipe(concat('home.js'))
.pipe(gulp.dest('web/js'));
const scriptsExternalPages = () =>
gulp.src(['assets/js/api/**/*.js', 'assets/js/duplicates/**/*.js'])
.pipe(concat('external-pages.js'))
.pipe(gulp.dest('web/js'));
const scriptsElementForm = () =>
gulp.src(['assets/js/element-form/**/*.js', 'node_modules/universal-geocoder/dist/universal-geocoder.js'])
.pipe(concat('element-form.js'))
.pipe(gulp.dest('web/js'));
const buildTranslations = () => {
const admin = gulp.src('translations/admin+intl-icu.*.yaml')
.pipe(yaml({schema: 'DEFAULT_SAFE_SCHEMA', ext: '.js'}))
.pipe(tap(function(file, t) {
var locale = file.basename.split('.')[1]
var transTable = JSON.parse(file.contents.toString())['js']
file.contents = Buffer.from('"' + locale + '": ' + JSON.stringify(transTable) + ', ')
// log(file.contents.toString())
}))
.pipe(concat('javascripts-translations-admin.js'))
.pipe(header("var gogoI18n = {"))
.pipe(footer("}"))
.pipe(gulp.dest('web/js'))
const public = gulp.src('translations/messages+intl-icu.*.yaml')
.pipe(yaml({schema: 'DEFAULT_SAFE_SCHEMA', ext: '.js'}))
.pipe(tap(function(file, t) {
var locale = file.basename.split('.')[1]
var transTable = JSON.parse(file.contents.toString())['js']
file.contents = Buffer.from('"' + locale + '": ' + JSON.stringify(transTable) + ', ')
// log(file.contents.toString())
}))
.pipe(concat('javascripts-translations.js'))
.pipe(header("var gogoI18n = {"))
.pipe(footer("}"))
.pipe(gulp.dest('web/js'))
return merge(admin, public)
}
const scriptsLibs = () => {
const gogocarto = gulp.src([
'node_modules/gogocarto-js/dist/gogocarto.js',
'assets/js/init-sw.js',
'custom/**/*.js',
'assets/js/i18n.js',
'web/js/javascripts-translations.js'])
.pipe(concat('gogocarto.js'))
.pipe(gulp.dest('web/js'));
const sw = gulp.src(['assets/js/vendor/**/*'])
.pipe(gulp.dest('web/js'));
return merge(gogocarto, sw);
};
const serviceWorker = async () => {
const { count, size, warnings } = await workboxBuild.injectManifest({
swSrc: 'assets/js/sw.js',
swDest: 'web/sw.js',
globDirectory: 'web',
globPatterns: [
'+(fonts|img|js|css)\/**\/*.{js,css,html,png,woff,woff2,ico}'
],
maximumFileSizeToCacheInBytes: 10 * 1024 * 1024
});
// Optionally, log any warnings and details.
warnings.forEach(console.warn);
console.log(`${count} files will be precached, totaling ${size} bytes.`);
};
const stylesBuild = () => {
const vendor = gulp.src(['assets/scss/vendor/*.css']).pipe(gulp.dest('web/css'));
const scss = gulp.src(['assets/scss/**/*.scss'])
.pipe(sass().on('error', sass.logError))
.pipe(gulp.dest('web/css'));
return merge(vendor, scss);
};
const gogocarto_assets = () => {
const js = gulp.src(['node_modules/gogocarto-js/dist/gogocarto.css', 'custom/**/*.css',])
.pipe(concat('gogocarto.css'))
.pipe(gulp.dest('web/css'));
const fonts = gulp.src(['node_modules/gogocarto-js/dist/fonts/**/*',])
.pipe(gulp.dest('web/css/fonts'));
const images = gulp.src(['node_modules/gogocarto-js/dist/images/**/*'])
.pipe(gulp.dest('web/css/images'));
return merge(js, fonts, images);
};
const prod_styles = () =>
gulp.src('web/css/*.css')
.pipe(minifycss())
.pipe(gulp.dest('web/css'));
const gzip_styles = () =>
gulp.src('web/css/**/*.css!(.gz)')
.pipe(gzip())
.pipe(gulp.dest('web/css'));
const prod_js = () =>
gulp.src(['web/js/!(*.min)*.js', '!web/js/external-pages.js']) // external page use a lib that fail to be minified
.pipe(uglify())
.pipe(uglify().on('error', (uglify) => {
console.error(uglify.message);
this.emit('end');
}))
.pipe(gulp.dest('web/js'));
const gzip_js = () =>
gulp.src(['web/js/**/*.js!(.gz)'])
.pipe(gzip())
.pipe(gulp.dest('web/js'));
exports.watch = () => {
// Watch .scss files
gulp.watch(['assets/scss/**/*.scss'], gulp.series(stylesBuild, serviceWorker));
gulp.watch(['assets/js/element-form/**/*.js'],
gulp.series(scriptsElementForm, serviceWorker));
gulp.watch(['assets/js/**/*.js', '!assets/js/element-form/**/*.js'],
gulp.series(scriptsExternalPages, serviceWorker));
gulp.watch(['node_modules/gogocarto-js/dist/**/*', 'custom/**/*.css'],
gulp.series(gogocarto_assets, serviceWorker));
gulp.watch(['assets/js/vendor/**/*.js','assets/js/admin/**/*.js', 'node_modules/gogocarto-js/dist/gogocarto.js', 'custom/**/*.js', 'assets/js/i18n.js', 'translations/*.yaml'],
gulp.series(buildTranslations, scriptsLibs, serviceWorker));
gulp.watch(['assets/js/home.js'], gulp.series(scriptsHome, serviceWorker));
};
const cleanCss = () =>
del(['web/css']);
const cleanJs = () =>
del(['web/js']);
exports.build = gulp.series(cleanJs, cleanCss, buildTranslations, gulp.parallel(stylesBuild, scriptsLibs, scriptsHome, scriptsExternalPages, scriptsElementForm, gogocarto_assets), serviceWorker);
exports.production = gulp.parallel(gulp.series(prod_styles, gzip_styles), gulp.series(prod_js, gzip_js));
exports.libs = gulp.series(scriptsLibs)
exports.i18n = gulp.series(buildTranslations)