aboutsummaryrefslogtreecommitdiffstats
path: root/gulpfile.js
diff options
context:
space:
mode:
Diffstat (limited to 'gulpfile.js')
-rw-r--r--gulpfile.js270
1 files changed, 162 insertions, 108 deletions
diff --git a/gulpfile.js b/gulpfile.js
index eec51aba..b536662b 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -12,7 +12,7 @@ const concat = require('gulp-concat');
const filter = require('gulp-filter');
const sass = require('gulp-sass');
const cleancss = require('gulp-clean-css');
-const run = require('run-sequence');
+const header = require('gulp-header');
const prefix = require('gulp-autoprefixer');
const gitbranch = require('git-branch');
const svgstore = require('gulp-svgstore');
@@ -28,53 +28,46 @@ const sourcemaps = require('gulp-sourcemaps');
const uglify = require('gulp-uglify-es').default;
const commonjs = require('rollup-plugin-commonjs');
const resolve = require('rollup-plugin-node-resolve');
+const FastlyPurge = require('fastly-purge');
+const through = require('through2');
const bundles = require('./bundles.json');
const pkg = require('./package.json');
-// Get AWS config
-let aws = {};
-try {
- aws = require('./aws.json'); //eslint-disable-line
-} catch (e) {
- // Do nothing
-}
-
const minSuffix = '.min';
// Paths
-const root = __dirname;
const paths = {
plyr: {
// Source paths
src: {
- sass: path.join(root, 'src/sass/**/*.scss'),
- js: path.join(root, 'src/js/**/*'),
- sprite: path.join(root, 'src/sprite/*.svg'),
+ sass: path.join(__dirname, 'src/sass/**/*.scss'),
+ js: path.join(__dirname, 'src/js/**/*.js'),
+ sprite: path.join(__dirname, 'src/sprite/*.svg'),
},
// Output paths
- output: path.join(root, 'dist/'),
+ output: path.join(__dirname, 'dist/'),
},
demo: {
// Source paths
src: {
- sass: path.join(root, 'demo/src/sass/**/*.scss'),
- js: path.join(root, 'demo/src/js/**/*'),
+ sass: path.join(__dirname, 'demo/src/sass/**/*.scss'),
+ js: path.join(__dirname, 'demo/src/js/**/*.js'),
},
// Output paths
- output: path.join(root, 'demo/dist/'),
+ output: path.join(__dirname, 'demo/dist/'),
// Demo
- root: path.join(root, 'demo/'),
+ root: path.join(__dirname, 'demo/'),
},
upload: [
- path.join(root, `dist/*${minSuffix}.*`),
- path.join(root, 'dist/*.css'),
- path.join(root, 'dist/*.svg'),
- path.join(root, `demo/dist/*${minSuffix}.*`),
- path.join(root, 'demo/dist/*.css'),
+ path.join(__dirname, `dist/*${minSuffix}.*`),
+ path.join(__dirname, 'dist/*.css'),
+ path.join(__dirname, 'dist/*.svg'),
+ path.join(__dirname, `demo/dist/*${minSuffix}.*`),
+ path.join(__dirname, 'demo/dist/*.css'),
],
};
@@ -93,62 +86,63 @@ const sizeOptions = { showFiles: true, gzip: true };
const browsers = ['> 1%'];
// Babel config
-const babelrc = {
- presets: [[
- 'env',
- {
- targets: {
- browsers,
+const babelrc = (polyfill = false) => ({
+ presets: [
+ [
+ '@babel/preset-env',
+ {
+ targets: {
+ browsers,
+ },
+ useBuiltIns: polyfill ? 'usage' : false,
+ modules: false,
},
- useBuiltIns: true,
- modules: false,
- },
- ]],
- plugins: ['external-helpers'],
+ ],
+ ],
babelrc: false,
exclude: 'node_modules/**',
-};
+});
// Clean out /dist
-gulp.task('clean', () => {
- const dirs = [
- paths.plyr.output,
- paths.demo.output,
- ].map(dir => path.join(dir, '**/*'));
+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();
});
const build = {
js(files, bundle, options) {
Object.keys(files).forEach(key => {
- const name = `js:${key}`;
+ const { format } = options;
+ const name = `js:${key}:${format}`;
tasks.js.push(name);
const { output } = paths[bundle];
+ const polyfill = name.includes('polyfilled');
+ const extension = format === 'es' ? '.mjs' : '.js';
return gulp.task(name, () =>
gulp
.src(bundles[bundle].js[key])
.pipe(sourcemaps.init())
.pipe(concat(key))
+
.pipe(
rollup(
{
- plugins: [
- resolve(),
- commonjs(),
- babel(babelrc),
- ],
+ plugins: [resolve(), commonjs(), babel(babelrc(polyfill))],
},
options,
),
)
- .pipe(sourcemaps.write(''))
+ .pipe(header('typeof navigator === "object" && ')) // "Support" SSR (#935)
+ .pipe(rename({ extname: extension }))
.pipe(gulp.dest(output))
- .pipe(filter('**/*.js'))
+ .pipe(filter(`**/*${extension}`))
.pipe(uglify())
.pipe(size(sizeOptions))
.pipe(rename({ suffix: minSuffix }))
@@ -185,21 +179,26 @@ const build = {
.src(paths[bundle].src.sprite)
.pipe(
svgmin({
- plugins: [{
- removeDesc: true,
- }],
+ plugins: [
+ {
+ removeDesc: true,
+ },
+ ],
}),
)
.pipe(svgstore())
.pipe(rename({ basename: bundle }))
.pipe(size(sizeOptions))
- .pipe(gulp.dest(paths[bundle].output)),
+ .pipe(gulp.dest(paths[bundle].output))
+ .pipe(gulp.dest(paths.demo.output)),
);
},
};
// Plyr core files
-build.js(bundles.plyr.js, 'plyr', { name: 'Plyr', format: 'umd' });
+const namespace = 'Plyr';
+build.js(bundles.plyr.js, 'plyr', { name: namespace, format: 'umd' });
+build.js(bundles.plyr.js, 'plyr', { name: namespace, format: 'es' });
build.sass(bundles.plyr.sass, 'plyr');
build.sprite('plyr');
@@ -208,43 +207,47 @@ build.sass(bundles.demo.sass, 'demo');
build.js(bundles.demo.js, 'demo', { format: 'iife' });
// Build all JS
-gulp.task('js', () => {
- run(tasks.js);
-});
+gulp.task('js', () => gulp.parallel(...tasks.js));
// Watch for file changes
gulp.task('watch', () => {
// Plyr core
- gulp.watch(paths.plyr.src.js, tasks.js);
- gulp.watch(paths.plyr.src.sass, tasks.sass);
- gulp.watch(paths.plyr.src.sprite, tasks.sprite);
+ gulp.watch(paths.plyr.src.js, gulp.parallel(...tasks.js));
+ gulp.watch(paths.plyr.src.sass, gulp.parallel(...tasks.sass));
+ gulp.watch(paths.plyr.src.sprite, gulp.parallel(...tasks.sprite));
// Demo
- gulp.watch(paths.demo.src.js, tasks.js);
- gulp.watch(paths.demo.src.sass, tasks.sass);
+ gulp.watch(paths.demo.src.js, gulp.parallel(...tasks.js));
+ gulp.watch(paths.demo.src.sass, gulp.parallel(...tasks.sass));
});
+// Build distribution
+gulp.task('build', gulp.series(tasks.clean, gulp.parallel(...tasks.js, ...tasks.sass, ...tasks.sprite)));
+
// Default gulp task
-gulp.task('default', () => {
- run(tasks.clean, tasks.js, tasks.sass, tasks.sprite, 'watch');
-});
+gulp.task('default', gulp.series('build', 'watch'));
// Publish a version to CDN and demo
// --------------------------------------------
-// If aws is setup
-if (Object.keys(aws).includes('cdn') && Object.keys(aws).includes('demo')) {
+// Get deployment config
+let credentials = {};
+try {
+ credentials = require('./credentials.json'); //eslint-disable-line
+} catch (e) {
+ // Do nothing
+}
+
+// If deployment is setup
+if (Object.keys(credentials).includes('aws') && Object.keys(credentials).includes('fastly')) {
const { version } = pkg;
+ const { aws, fastly } = credentials;
// Get branch info
const branch = {
current: gitbranch.sync(),
master: 'master',
- beta: 'beta',
+ develop: 'develop',
};
- const allowed = [
- branch.master,
- branch.beta,
- ];
const maxAge = 31536000; // 1 year
const options = {
@@ -255,7 +258,7 @@ if (Object.keys(aws).includes('cdn') && Object.keys(aws).includes('demo')) {
},
},
demo: {
- uploadPath: branch.current === branch.beta ? 'beta/' : null,
+ uploadPath: branch.current === branch.develop ? 'beta/' : null,
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate, max-age=0',
Vary: 'Accept-Encoding',
@@ -272,33 +275,51 @@ if (Object.keys(aws).includes('cdn') && Object.keys(aws).includes('demo')) {
},
};
- const regex = '(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*).(?:0|[1-9][0-9]*)(?:-[\\da-z\\-]+(?:.[\\da-z\\-]+)*)?(?:\\+[\\da-z\\-]+(?:.[\\da-z\\-]+)*)?';
+ const regex =
+ '(?:0|[1-9][0-9]*)\\.(?:0|[1-9][0-9]*).(?:0|[1-9][0-9]*)(?:-[\\da-z\\-]+(?:.[\\da-z\\-]+)*)?(?:\\+[\\da-z\\-]+(?:.[\\da-z\\-]+)*)?';
const semver = new RegExp(`v${regex}`, 'gi');
const localPath = new RegExp('(../)?dist', 'gi');
const versionPath = `https://${aws.cdn.domain}/${version}`;
const cdnpath = new RegExp(`${aws.cdn.domain}/${regex}/`, 'gi');
+ const renameFile = rename(p => {
+ p.basename = p.basename.replace(minSuffix, ''); // eslint-disable-line
+ p.dirname = p.dirname.replace('.', version); // eslint-disable-line
+ });
+
+ // Check we're on the correct branch to deploy
+ const canDeploy = () => {
+ const allowed = [branch.master, branch.develop];
+
+ if (!allowed.includes(branch.current)) {
+ console.error(`Must be on ${allowed.join(', ')} to publish! (current: ${branch.current})`);
+
+ return false;
+ }
+
+ return true;
+ };
+
gulp.task('version', () => {
+ if (!canDeploy()) {
+ return null;
+ }
+
console.log(`Updating versions to '${version}'...`);
// Replace versioned URLs in source
- const files = [
- 'plyr.js',
- 'plyr.polyfilled.js',
- 'defaults.js',
- ];
+ const files = ['plyr.js', 'plyr.polyfilled.js', 'config/defaults.js'];
return gulp
- .src(files.map(file => path.join(root, `src/js/${file}`)))
+ .src(files.map(file => path.join(__dirname, `src/js/${file}`)), { base: '.' })
.pipe(replace(semver, `v${version}`))
.pipe(replace(cdnpath, `${aws.cdn.domain}/${version}/`))
- .pipe(gulp.dest(path.join(root, 'src/js/')));
+ .pipe(gulp.dest('./'));
});
// Publish version to CDN bucket
gulp.task('cdn', () => {
- if (!allowed.includes(branch.current)) {
- console.error(`Must be on ${allowed.join(', ')} to publish! (current: ${branch.current})`);
+ if (!canDeploy()) {
return null;
}
@@ -308,14 +329,14 @@ if (Object.keys(aws).includes('cdn') && Object.keys(aws).includes('demo')) {
return (
gulp
.src(paths.upload)
+ .pipe(renameFile)
+ // Remove min suffix from source map URL
.pipe(
- rename(p => {
- p.basename = p.basename.replace(minSuffix, ''); // eslint-disable-line
- p.dirname = p.dirname.replace('.', version); // eslint-disable-line
- }),
+ replace(
+ /sourceMappingURL=([\w-?.]+)/,
+ (match, p1) => `sourceMappingURL=${p1.replace(minSuffix, '')}`,
+ ),
)
- // Remove min suffix from source map URL
- .pipe(replace(/sourceMappingURL=([\w-?.]+)/, (match, p1) => `sourceMappingURL=${p1.replace(minSuffix, '')}`))
.pipe(
size({
showFiles: true,
@@ -327,20 +348,48 @@ if (Object.keys(aws).includes('cdn') && Object.keys(aws).includes('demo')) {
);
});
+ // Purge the fastly cache incase any 403/404 are cached
+ gulp.task('purge', () => {
+ const list = [];
+
+ return gulp
+ .src(paths.upload)
+ .pipe(
+ through.obj((file, enc, cb) => {
+ const filename = file.path.split('/').pop();
+ list.push(`${versionPath}/${filename}`);
+ cb(null);
+ }),
+ )
+ .on('end', () => {
+ const purge = new FastlyPurge(fastly.token);
+
+ list.forEach(url => {
+ console.log(`Purging ${url}...`);
+
+ purge.url(url, (error, result) => {
+ if (error) {
+ console.log(error);
+ } else if (result) {
+ console.log(result);
+ }
+ });
+ });
+ });
+ });
+
// Publish to demo bucket
gulp.task('demo', () => {
- if (!allowed.includes(branch.current)) {
- console.error(`Must be on ${allowed.join(', ')} to publish! (current: ${branch.current})`);
+ if (!canDeploy()) {
return null;
}
console.log(`Uploading '${version}' demo to ${aws.demo.domain}...`);
// Replace versioned files in readme.md
- gulp
- .src([`${root}/readme.md`])
+ gulp.src([`${__dirname}/readme.md`])
.pipe(replace(cdnpath, `${aws.cdn.domain}/${version}/`))
- .pipe(gulp.dest(root));
+ .pipe(gulp.dest(__dirname));
// Replace local file paths with remote paths in demo HTML
// e.g. "../dist/plyr.js" to "https://cdn.plyr.io/x.x.x/plyr.js"
@@ -352,8 +401,7 @@ if (Object.keys(aws).includes('cdn') && Object.keys(aws).includes('demo')) {
pages.push(error);
}
- gulp
- .src(pages)
+ gulp.src(pages)
.pipe(replace(localPath, versionPath))
.pipe(s3(aws.demo, options.demo));
@@ -392,22 +440,28 @@ if (Object.keys(aws).includes('cdn') && Object.keys(aws).includes('demo')) {
}));
}); */
- // Open the demo site to check it's sweet
- gulp.task('open', () => {
- console.log(`Opening ${aws.demo.domain}...`);
-
- // A file must be specified or gulp will skip the task
- // Doesn't matter which file since we set the URL above
- // Weird, I know...
- return gulp.src([`${paths.demo.root}index.html`]).pipe(
- open('', {
- url: `http://${aws.demo.domain}`,
+ // Open the demo site to check it's ok
+ gulp.task('open', callback => {
+ gulp.src(__filename).pipe(
+ open({
+ uri: `https://${aws.demo.domain}`,
}),
);
+
+ callback();
});
// Do everything
- gulp.task('publish', callback => {
- run('version', tasks.clean, tasks.js, tasks.sass, tasks.sprite, 'cdn', 'demo', callback);
- });
+ gulp.task(
+ 'deploy',
+ gulp.series(
+ 'version',
+ tasks.clean,
+ gulp.parallel(...tasks.js, ...tasks.sass, ...tasks.sprite),
+ 'cdn',
+ 'demo',
+ 'purge',
+ 'open',
+ ),
+ );
}