1
0
Fork 0
why-cant-we-deploy-today/gulpfile.js

361 lines
8.8 KiB
JavaScript

const pkg = require("./package.json");
const path = require("path");
const glob = require("glob");
const yargs = require("yargs");
const colors = require("colors");
const through = require("through2");
const qunit = require("node-qunit-puppeteer");
const { rollup } = require("rollup");
const { terser } = require("rollup-plugin-terser");
const babel = require("@rollup/plugin-babel").default;
const commonjs = require("@rollup/plugin-commonjs");
const resolve = require("@rollup/plugin-node-resolve").default;
const sass = require("sass");
const gulp = require("gulp");
const tap = require("gulp-tap");
const zip = require("gulp-zip");
const header = require("gulp-header");
const eslint = require("gulp-eslint");
const minify = require("gulp-clean-css");
const connect = require("gulp-connect");
const autoprefixer = require("gulp-autoprefixer");
const root = yargs.argv.root || ".";
const port = yargs.argv.port || 8000;
const host = yargs.argv.host || "localhost";
const banner = `/*!
* reveal.js ${pkg.version}
* ${pkg.homepage}
* MIT licensed
*
* Copyright (C) 2011-2023 Hakim El Hattab, https://hakim.se
*/\n`;
// Prevents warnings from opening too many test pages
process.setMaxListeners(20);
const babelConfig = {
babelHelpers: "bundled",
ignore: ["node_modules"],
compact: false,
extensions: [".js", ".html"],
plugins: ["transform-html-import-to-string"],
presets: [
[
"@babel/preset-env",
{
corejs: 3,
useBuiltIns: "usage",
modules: false,
},
],
],
};
// Our ES module bundle only targets newer browsers with
// module support. Browsers are targeted explicitly instead
// of using the "esmodule: true" target since that leads to
// polyfilling older browsers and a larger bundle.
const babelConfigESM = JSON.parse(JSON.stringify(babelConfig));
babelConfigESM.presets[0][1].targets = {
browsers: [
"last 2 Chrome versions",
"last 2 Safari versions",
"last 2 iOS versions",
"last 2 Firefox versions",
"last 2 Edge versions",
],
};
let cache = {};
// Creates a bundle with broad browser support, exposed
// as UMD
gulp.task("js-es5", () => {
return rollup({
cache: cache.umd,
input: "js/index.js",
plugins: [resolve(), commonjs(), babel(babelConfig), terser()],
}).then((bundle) => {
cache.umd = bundle.cache;
return bundle.write({
name: "Reveal",
file: "./dist/reveal.js",
format: "umd",
banner: banner,
sourcemap: true,
});
});
});
// Creates an ES module bundle
gulp.task("js-es6", () => {
return rollup({
cache: cache.esm,
input: "js/index.js",
plugins: [resolve(), commonjs(), babel(babelConfigESM), terser()],
}).then((bundle) => {
cache.esm = bundle.cache;
return bundle.write({
file: "./dist/reveal.esm.js",
format: "es",
banner: banner,
sourcemap: true,
});
});
});
gulp.task("js", gulp.parallel("js-es5", "js-es6"));
// Creates a UMD and ES module bundle for each of our
// built-in plugins
gulp.task("plugins", () => {
return Promise.all(
[
{
name: "RevealHighlight",
input: "./plugin/highlight/plugin.js",
output: "./plugin/highlight/highlight",
},
{
name: "RevealMarkdown",
input: "./plugin/markdown/plugin.js",
output: "./plugin/markdown/markdown",
},
{
name: "RevealSearch",
input: "./plugin/search/plugin.js",
output: "./plugin/search/search",
},
{
name: "RevealNotes",
input: "./plugin/notes/plugin.js",
output: "./plugin/notes/notes",
},
{
name: "RevealZoom",
input: "./plugin/zoom/plugin.js",
output: "./plugin/zoom/zoom",
},
{
name: "RevealMath",
input: "./plugin/math/plugin.js",
output: "./plugin/math/math",
},
].map((plugin) => {
return rollup({
cache: cache[plugin.input],
input: plugin.input,
plugins: [
resolve(),
commonjs(),
babel({
...babelConfig,
ignore: [/node_modules\/(?!(highlight\.js|marked)\/).*/],
}),
terser(),
],
}).then((bundle) => {
cache[plugin.input] = bundle.cache;
bundle.write({
file: plugin.output + ".esm.js",
name: plugin.name,
format: "es",
});
bundle.write({
file: plugin.output + ".js",
name: plugin.name,
format: "umd",
});
});
})
);
});
// a custom pipeable step to transform Sass to CSS
function compileSass() {
return through.obj((vinylFile, encoding, callback) => {
const transformedFile = vinylFile.clone();
sass.render(
{
data: transformedFile.contents.toString(),
includePaths: ["css/", "css/theme/template"],
},
(err, result) => {
if (err) {
console.log(vinylFile.path);
console.log(err.formatted);
} else {
transformedFile.extname = ".css";
transformedFile.contents = result.css;
callback(null, transformedFile);
}
}
);
});
}
gulp.task("css-themes", () =>
gulp
.src(["./css/theme/source/*.{sass,scss}"])
.pipe(compileSass())
.pipe(gulp.dest("./dist/theme"))
);
gulp.task("css-core", () =>
gulp
.src(["css/reveal.scss"])
.pipe(compileSass())
.pipe(autoprefixer())
.pipe(minify({ compatibility: "ie9" }))
.pipe(header(banner))
.pipe(gulp.dest("./dist"))
);
gulp.task("css", gulp.parallel("css-themes", "css-core"));
gulp.task("qunit", () => {
let serverConfig = {
root,
port: 8009,
host: "localhost",
name: "test-server",
};
let server = connect.server(serverConfig);
let testFiles = glob.sync("test/*.html");
let totalTests = 0;
let failingTests = 0;
let tests = Promise.all(
testFiles.map((filename) => {
return new Promise((resolve, reject) => {
qunit
.runQunitPuppeteer({
targetUrl: `http://${serverConfig.host}:${serverConfig.port}/${filename}`,
timeout: 20000,
redirectConsole: false,
puppeteerArgs: ["--allow-file-access-from-files"],
})
.then((result) => {
if (result.stats.failed > 0) {
console.log(
`${"!"} ${filename} [${result.stats.passed}/${
result.stats.total
}] in ${result.stats.runtime}ms`.red
);
// qunit.printResultSummary(result, console);
qunit.printFailedTests(result, console);
} else {
console.log(
`${"✔"} ${filename} [${result.stats.passed}/${
result.stats.total
}] in ${result.stats.runtime}ms`.green
);
}
totalTests += result.stats.total;
failingTests += result.stats.failed;
resolve();
})
.catch((error) => {
console.error(error);
reject();
});
});
})
);
return new Promise((resolve, reject) => {
tests
.then(() => {
if (failingTests > 0) {
reject(new Error(`${failingTests}/${totalTests} tests failed`.red));
} else {
console.log(`${"✔"} Passed ${totalTests} tests`.green.bold);
resolve();
}
})
.catch(() => {
reject();
})
.finally(() => {
server.close();
});
});
});
gulp.task("eslint", () =>
gulp.src(["./js/**", "gulpfile.js"]).pipe(eslint()).pipe(eslint.format())
);
gulp.task("test", gulp.series("eslint", "qunit"));
gulp.task(
"default",
gulp.series(gulp.parallel("js", "css", "plugins"), "test")
);
gulp.task("build", gulp.parallel("js", "css", "plugins"));
gulp.task(
"package",
gulp.series(() =>
gulp
.src(
[
"./index.html",
"./dist/**",
"./lib/**",
"./images/**",
"./plugin/**",
"./**/*.md",
],
{ base: "./" }
)
.pipe(zip("reveal-js-presentation.zip"))
.pipe(gulp.dest("./"))
)
);
gulp.task("reload", () =>
gulp.src(["**/*.html", "**/*.md"]).pipe(connect.reload())
);
gulp.task("serve", () => {
connect.server({
root: root,
port: port,
host: host,
livereload: true,
});
gulp.watch(["**/*.html", "**/*.md"], gulp.series("reload"));
gulp.watch(["js/**"], gulp.series("js", "reload", "eslint"));
gulp.watch(
["plugin/**/plugin.js", "plugin/**/*.html"],
gulp.series("plugins", "reload")
);
gulp.watch(
["css/theme/source/*.{sass,scss}", "css/theme/template/*.{sass,scss}"],
gulp.series("css-themes", "reload")
);
gulp.watch(
["css/*.scss", "css/print/*.{sass,scss,css}"],
gulp.series("css-core", "reload")
);
gulp.watch(["test/*.html"], gulp.series("test"));
});