/* eslint-disable import/no-extraneous-dependencies */ // ========================================================================== // Gulp build script // ========================================================================== /* eslint no-console: "off" */ const path = require('path'); const gulp = require('gulp'); // JavaScript const terser = require('gulp-terser'); const rollup = require('gulp-better-rollup'); const babel = require('rollup-plugin-babel'); const commonjs = require('rollup-plugin-commonjs'); const resolve = require('rollup-plugin-node-resolve'); // CSS const sass = require('gulp-sass')(require('sass')); const postcss = require('gulp-postcss'); const autoprefixer = require('autoprefixer'); const cssnano = require('cssnano'); const customprops = require('postcss-custom-properties'); // Images const svgstore = require('gulp-svgstore'); const imagemin = require('gulp-imagemin'); // Utils const del = require('del'); const filter = require('gulp-filter'); const header = require('gulp-header'); const rename = require('gulp-rename'); const plumber = require('gulp-plumber'); const size = require('gulp-size'); const sourcemaps = require('gulp-sourcemaps'); const browserSync = require('browser-sync').create(); const gulpIf = require('gulp-if'); // Configs const build = require('../build.json'); // Info from package const minSuffix = '.min'; // Paths const root = path.join(__dirname, '..'); const paths = { plyr: { // Source paths src: { sass: path.join(root, 'src/sass/**/*.scss'), js: path.join(root, 'src/js/**/*.js'), sprite: path.join(root, 'src/sprite/*.svg'), }, // Output paths output: path.join(root, 'dist/'), }, demo: { // Source paths src: { sass: path.join(root, 'demo/src/sass/**/*.scss'), js: path.join(root, 'demo/src/js/**/*.js'), }, // Output paths output: path.join(root, 'demo/dist/'), // Demo root: path.join(root, 'demo/'), }, }; // Task lists const tasks = { css: [], js: [], sprite: [], }; // Size plugin const sizeOptions = { showFiles: true, gzip: true }; // Clean out /dist gulp.task('clean', (done) => { const dirs = [paths.plyr.output, paths.demo.output].map((dir) => path.join(dir, '**/*')); // Don't delete the mp4 dirs.push(`!${path.join(paths.plyr.output, '**/*.mp4')}`); del(dirs); done(); }); // JavaScript Object.entries(build.js).forEach(([filename, entry]) => { const { dist, formats, namespace, polyfill, src } = entry; formats.forEach((format) => { const name = `js:${filename}:${format}`; const extension = format === 'es' ? 'mjs' : 'js'; tasks.js.push(name); gulp.task(name, () => gulp .src(src) .pipe(plumber()) .pipe(sourcemaps.init()) .pipe( rollup( { plugins: [ resolve(), commonjs(), babel({ presets: [ [ '@babel/env', { // debug: true, useBuiltIns: polyfill ? 'usage' : false, corejs: polyfill ? 3 : undefined, bugfixes: true, }, ], ], plugins: ['@babel/plugin-proposal-class-properties'], babelrc: false, exclude: [/\/core-js\//], }), ], }, { name: namespace, format, }, ), ) .pipe(gulpIf(() => extension !== 'mjs', header('typeof navigator === "object" && '))) // "Support" SSR (#935) .pipe( rename({ extname: `.${extension}`, }), ) .pipe(gulp.dest(dist)) .pipe(filter(`**/*.${extension}`)) .pipe(terser()) .pipe(rename({ suffix: minSuffix })) .pipe(size(sizeOptions)) .pipe(sourcemaps.write('')) .pipe(gulp.dest(dist)), ); }); }); // CSS Object.entries(build.css).forEach(([filename, entry]) => { const { dist, src } = entry; const name = `css:${filename}`; tasks.css.push(name); gulp.task(name, () => gulp .src(src) .pipe(plumber()) .pipe(sass()) .pipe( postcss([ customprops(), autoprefixer(), cssnano({ preset: 'default', }), ]), ) .pipe(size(sizeOptions)) .pipe(gulp.dest(dist)), ); }); // SVG Sprites Object.entries(build.sprite).forEach(([filename, entry]) => { const { dist, src } = entry; const name = `sprite:${filename}`; tasks.sprite.push(name); gulp.task(name, () => gulp .src(src) .pipe(plumber()) .pipe( imagemin([ imagemin.svgo({ plugins: [{ removeViewBox: false }], }), ]), ) .pipe(svgstore()) .pipe(rename({ basename: path.parse(filename).name })) .pipe(size(sizeOptions)) .pipe(gulp.dest(dist)), ); }); // Build all tasks gulp.task('js', gulp.parallel(...tasks.js)); gulp.task('css', gulp.parallel(...tasks.css)); gulp.task('sprites', gulp.parallel(...tasks.sprite)); // Watch for file changes gulp.task('watch', () => { // Plyr core gulp.watch(paths.plyr.src.js, gulp.parallel('js')); gulp.watch(paths.plyr.src.sass, gulp.parallel('css')); gulp.watch(paths.plyr.src.sprite, gulp.parallel('sprites')); // Demo gulp.watch(paths.demo.src.js, gulp.parallel('js')); gulp.watch(paths.demo.src.sass, gulp.parallel('css')); }); // Serve via browser sync gulp.task('serve', () => browserSync.init({ server: { baseDir: paths.demo.root, }, notify: false, watch: true, ghostMode: false, }), ); // Build distribution gulp.task('build', gulp.series('clean', gulp.parallel('js', 'css', 'sprites'))); // Default gulp task gulp.task('default', gulp.series('build', gulp.parallel('serve', 'watch')));