plyr
Version:
A simple, accessible and customizable HTML5, YouTube and Vimeo media player
217 lines (198 loc) • 5.88 kB
JavaScript
import { readFileSync } from 'node:fs';
import path, { join } from 'node:path';
import babel from '@rollup/plugin-babel';
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import autoprefixer from 'autoprefixer';
import browserSync from 'browser-sync';
import cssnano from 'cssnano';
import { deleteAsync } from 'del';
import gulp from 'gulp';
import rollup from 'gulp-better-rollup';
import filter from 'gulp-filter';
import header from 'gulp-header';
import gulpIf from 'gulp-if';
import imagemin from 'gulp-imagemin';
import plumber from 'gulp-plumber';
import postcss from 'gulp-postcss';
import rename from 'gulp-rename';
import sass from 'gulp-sass';
import size from 'gulp-size';
import sourcemaps from 'gulp-sourcemaps';
import svgstore from 'gulp-svgstore';
import terser from 'gulp-terser';
import imageminSvgo from 'imagemin-svgo';
import customprops from 'postcss-custom-properties';
import * as dartSass from 'sass';
const jobs = JSON.parse(readFileSync(join(path.resolve(), 'build.json'), 'utf-8'));
const bs = browserSync.create();
const sassCompiler = sass(dartSass);
const minSuffix = '.min';
// Paths
const root = path.resolve();
const paths = {
plyr: {
src: {
sass: path.join(root, 'src/sass/**/*.scss'),
js: path.join(root, 'src/js/**/*.js'),
sprite: path.join(root, 'src/sprite/*.svg'),
},
output: path.join(root, 'dist/'),
},
demo: {
src: {
sass: path.join(root, 'demo/src/sass/**/*.scss'),
js: path.join(root, 'demo/src/js/**/*.js'),
},
output: path.join(root, 'demo/dist/'),
root: path.join(root, 'demo/'),
},
};
// Task lists
const tasks = {
css: [],
js: [],
sprite: [],
};
// Size plugin options
const sizeOptions = { showFiles: true, gzip: true };
// Clean task
export async function clean() {
const dirs = [paths.plyr.output, paths.demo.output].map(dir => path.join(dir, '**/*'));
dirs.push(`!${path.join(paths.plyr.output, '**/*.mp4')}`);
return await deleteAsync(dirs);
};
// JavaScript tasks
Object.entries(jobs.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({
babelHelpers: 'bundled',
presets: [
[
'@babel/env',
{
useBuiltIns: polyfill ? 'usage' : false,
corejs: polyfill ? 3 : undefined,
bugfixes: true,
},
],
],
plugins: [
'@babel/plugin-proposal-class-properties',
'@babel/plugin-transform-nullish-coalescing-operator',
'@babel/plugin-proposal-optional-chaining',
],
babelrc: false,
exclude: [/\/core-js\//],
}),
],
},
{
name: namespace,
format,
},
),
)
.pipe(gulpIf(() => extension !== 'mjs', header('typeof navigator === "object" && ')))
.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 tasks
Object.entries(jobs.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(sassCompiler())
.pipe(
postcss([
customprops(),
autoprefixer(),
cssnano({ preset: 'default' }),
]),
)
.pipe(size(sizeOptions))
.pipe(gulp.dest(dist)));
});
// SVG Sprite tasks
Object.entries(jobs.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([
imageminSvgo({
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false, // Keep viewBox attribute
},
},
},
],
}),
]),
)
.pipe(svgstore())
.pipe(rename({ basename: path.parse(filename).name }))
.pipe(size(sizeOptions))
.pipe(gulp.dest(dist)));
});
// Build tasks
export const js = gulp.parallel(...tasks.js);
export const css = gulp.parallel(...tasks.css);
export const sprites = gulp.parallel(...tasks.sprite);
// Watch task
export function watch() {
gulp.watch(paths.plyr.src.js, js);
gulp.watch(paths.plyr.src.sass, css);
gulp.watch(paths.plyr.src.sprite, sprites);
gulp.watch(paths.demo.src.js, js);
gulp.watch(paths.demo.src.sass, css);
}
// Serve task
export function serve() {
return bs.init({
server: {
baseDir: paths.demo.root,
},
notify: false,
watch: true,
ghostMode: false,
});
}
// Build distribution
export const build = gulp.series(clean, gulp.parallel(js, css, sprites));
// Default task
export default gulp.series(build, gulp.parallel(serve, watch));