UNPKG

gsheetcmslight

Version:

A library to read a Google Sheet with multilingal content

381 lines (333 loc) 9.64 kB
/** * Settings * Turn on/off build features */ var settings = { clean: true, scripts: true, polyfills: true, styles: true, svgs: true, copy: true, images: true, reload: true, useFontAwesome: true, useVue: true, useGsheets2Json: true, }; /** * Paths to project folders */ var paths = { input: "src/", output: "dist/", bundle: "gsheetscms", scripts: { input: ["src/js/"], polyfills: ".polyfill.js", output: "dist/js/", }, styles: { input: "src/sass/**/*.{scss,sass}", output: "dist/css/", concat: "app.min.css", }, svgs: { input: "src/svg/*.svg", output: "dist/svg/", }, images: { input: ["src/copy/img/*.jpg"], output: "dist/img/", }, copy: { input: "src/copy/**/*", output: "dist/", }, fastyles: { input: "node_modules/@fortawesome/fontawesome-pro/css/**/*.min.css", output: "dist/css/fontawesome/", }, fawebfonts: { input: "node_modules/@fortawesome/fontawesome-pro/webfonts/**/*.{woff,woff2}", output: "dist/css/webfonts/", }, vue: { input: "node_modules/vue/dist/vue.min.js", output: "dist/js/", }, gsheets2json: { input: "node_modules/gsheets2json/dist/gsheet2json.min.js", output: "dist/js/", }, reload: "./dist/", }; /** * Template for banner to add to file headers */ var banner = { main: "/*!" + " <%= package.name %> v<%= package.version %>" + " | (c) " + new Date().getFullYear() + " <%= package.author.name %>" + " | <%= package.license %> License" + " | <%= package.repository.url %>" + " */\n", }; /** * Gulp Packages */ // General var { gulp, src, dest, watch, series, parallel } = require("gulp"); var del = require("del"); //ok var flatmap = require("gulp-flatmap"); var lazypipe = require("lazypipe"); var rename = require("gulp-rename"); //ok var header = require("gulp-header"); //ok var package = require("./package.json"); var responsive = require("gulp-responsive"); // Scripts var jshint = require("gulp-jshint"); var stylish = require("jshint-stylish"); var concat = require("gulp-concat-2020"); var uglify = require("gulp-terser"); var optimizejs = require("gulp-optimize-js"); var useref = require("gulp-useref"); var gulpif = require("gulp-if"); // Styles var sass = require("gulp-sass"); var postcss = require("gulp-postcss"); var prefix = require("autoprefixer"); var minify = require("cssnano"); // SVGs var svgmin = require("gulp-svgmin"); // BrowserSync var browserSync = require("browser-sync"); //ok /** * Gulp Tasks */ // Remove pre-existing content from output folders var cleanDist = function (done) { // Make sure this feature is activated before running if (!settings.clean) return done(); // Clean the dist folder del.sync([paths.output]); // Signal completion return done(); }; // Repeated JavaScript tasks var jsTasks = lazypipe() .pipe(header, banner.main, { package: package }) .pipe(optimizejs) .pipe(dest, paths.scripts.output) .pipe(rename, { suffix: ".min" }) .pipe(uglify) .pipe(optimizejs) .pipe(header, banner.main, { package: package }) .pipe(dest, paths.scripts.output); // Lint, minify, and concatenate scripts var buildScripts = function (done) { // Make sure this feature is activated before running if (!settings.scripts) return done(); // Run tasks on script files return src(paths.scripts.input).pipe( flatmap(function (stream, file) { // If the file is a directory if (file.isDirectory()) { // Setup a suffix variable var suffix = ""; // If separate polyfill files enabled if (settings.polyfills) { // Update the suffix suffix = ".polyfills"; console.log( "Grab files that aren't polyfills, concatenate them, and process them" ); src([ file.path + "/*.js", "!" + file.path + "/*" + paths.scripts.polyfills, ]) .pipe(concat(`${paths.bundle}.js`)) .pipe(jsTasks()); } else { console.log("No polyfills"); } console.log("Grab all files and concatenate them"); console.log( "If separate polyfills enabled, this will have .polyfills in the filename" ); src(file.path + "/*.js") .pipe(concat(file.relative + suffix + ".js")) .pipe(jsTasks()); return stream; } console.log("Otherwise, process the file"); return stream.pipe(jsTasks()); }) ); }; // Lint scripts var lintScripts = function (done) { // Make sure this feature is activated before running if (!settings.scripts) return done(); // Lint scripts return src(paths.scripts.input) .pipe(jshint()) .pipe(jshint.reporter("jshint-stylish")); }; //copy vue library if needed var copyVue = function (done) { if (!settings.useVue) return done(); return src(paths.vue.input).pipe(dest(paths.vue.output)); }; //copy gsheets2json library if needed var copyGsheets2Json = function (done) { if (!settings.useGsheets2Json) return done(); return src(paths.gsheets2json.input).pipe(dest(paths.gsheets2json.output)); }; // Process, lint, and minify Sass files var buildStyles = function (done) { // Make sure this feature is activated before running if (!settings.styles) return done(); // Run tasks on all Sass files return src(paths.styles.input) .pipe( sass({ outputStyle: "expanded", sourceComments: true, }) ) .pipe( postcss([ prefix({ cascade: true, remove: true, }), ]) ) .pipe(header(banner.main, { package: package })) .pipe(dest(paths.styles.output)) .pipe(rename({ suffix: ".min" })) .pipe( postcss([ minify({ discardComments: { removeAll: true, }, }), ]) ) .pipe(concat(`${paths.bundle}.min.css`)) .pipe(dest(paths.styles.output)); }; // Process Font Awesome files var copyFontAwesome = function (done) { // Make sure this feature is activated before running if (!settings.useFontAwesome) return done(); // Run task const copyCss = src(paths.fastyles.input).pipe(dest(paths.fastyles.output)); const copyWebFonts = src(paths.fawebfonts.input).pipe( dest(paths.fawebfonts.output) ); return copyCss && copyWebFonts; }; // Optimize SVG files var buildSVGs = function (done) { // Make sure this feature is activated before running if (!settings.svgs) return done(); // Optimize SVG files return src(paths.svgs.input).pipe(svgmin()).pipe(dest(paths.svgs.output)); }; // Copy static files into output folder var copyFiles = function (done) { // Make sure this feature is activated before running if (!settings.copy) return done(); // Copy static files return src(paths.copy.input).pipe(dest(paths.copy.output)); }; // Generate responsive images var processImages = function (done) { // Make sure this feature is activated before running if (!settings.images) return done(); // Copy static files console.log(paths.images.input); return src(paths.images.input) .pipe( responsive( { // Resize all JPG images to three different sizes: 200, 500, and 630 pixels "*": [ { width: 300, rename: { suffix: "-300w" } }, { width: 600, rename: { suffix: "-600w" } }, { width: 1900, rename: { suffix: "-1900w" } }, { // Compress, strip metadata, and rename original image //used for the index.html across all viewports // //used for the index.html across all viewports rename: { suffix: "-800w" }, }, ], }, { // Global configuration for all images // The output quality for JPEG, WebP and TIFF output formats quality: 70, progressive: true, withMetadata: false, } ) // Use progressive (interlace) scan for JPEG and PNG output // Strip all metadata ) .pipe(dest(paths.images.output)); }; // Watch for changes to the src directory var startServer = function (done) { // Make sure this feature is activated before running if (!settings.reload) return done(); // Initialize BrowserSync browserSync.init({ server: { baseDir: paths.reload, }, }); // Signal completion done(); }; // Reload the browser when files change var reloadBrowser = function (done) { if (!settings.reload) return done(); browserSync.reload(); done(); }; // Watch for changes var watchSource = function (done) { watch(paths.input, series(exports.default, reloadBrowser)); done(); }; /** * Export Tasks */ // Default task // gulp exports.default = series( cleanDist, parallel( buildScripts, lintScripts, //bundleScripts, buildStyles, buildSVGs, copyFontAwesome, copyVue, copyGsheets2Json, copyFiles, processImages ) ); // Watch and reload // gulp watch exports.watch = series(exports.default, startServer, watchSource); //Watch while unit testing exports.test = series(exports.default, watchSource); exports.images = series(cleanDist, processImages); exports.clean = cleanDist;