monkeytype/frontend/gulpfile.js
Bruce Berrios 0fe99e0a28
Handle static assets with webpack (#2723) bruception
* Move some static file management to webpack

* Add build time feedback

* Add lint step back

* Use concurrently
2022-03-17 21:00:20 +01:00

121 lines
3.2 KiB
JavaScript

const del = require("del");
const concat = require("gulp-concat");
const { webpack } = require("webpack");
const eslint = require("gulp-eslint-new");
const vinylPaths = require("vinyl-paths");
const sass = require("gulp-sass")(require("dart-sass"));
const { task, src, dest, series, watch } = require("gulp");
const webpackDevConfig = require("./webpack/config.dev.js");
const webpackProdConfig = require("./webpack/config.prod.js");
const JSONValidation = require("./scripts/json-validation");
const eslintConfig = "../.eslintrc.json";
task("clean", function () {
return src(["./public/"], { allowEmpty: true }).pipe(vinylPaths(del));
});
task("lint", function () {
return src(["./src/scripts/**/*.js", "./src/scripts/**/*.ts"])
.pipe(eslint(eslintConfig))
.pipe(eslint.format())
.pipe(eslint.failAfterError());
});
task("lint-json", function () {
return src("./static/**/*.json")
.pipe(eslint(eslintConfig))
.pipe(eslint.format())
.pipe(eslint.failAfterError());
});
task("validate-json-schema", function () {
return JSONValidation.validateAll();
});
const taskWithWebpackConfig = (webpackConfig) => {
return async () => {
return new Promise((resolve, reject) => {
webpack(webpackConfig, (err, stats) => {
if (err) {
return reject(err);
}
if (stats.hasErrors()) {
return reject(new Error(stats.compilation.errors.join("\n")));
}
console.log(
`Finished building in ${
(stats.endTime - stats.startTime) / 1000
} second(s)`
);
resolve();
});
});
};
};
task("webpack", taskWithWebpackConfig(webpackDevConfig));
task("webpack-production", taskWithWebpackConfig(webpackProdConfig));
task("sass", function () {
return src("./src/styles/*.scss")
.pipe(concat("style.scss"))
.pipe(sass({ outputStyle: "compressed" }).on("error", sass.logError))
.pipe(dest("public/css"));
});
task("compile", series("lint", "lint-json", "webpack", "sass"));
task(
"compile-production",
series(
"lint",
"lint-json",
"validate-json-schema",
"webpack-production",
"sass"
)
);
task("watch", function () {
watch("./src/styles/*.scss", series("sass"));
watch(
[
"./src/scripts/**/*.js",
"./src/scripts/**/*.ts",
"./src/scripts/*.js",
"./src/scripts/*.ts",
],
series("lint")
);
watch(["./static/**/*.*", "./static/*.*"], series("lint-json"));
});
task("build", series("clean", "compile"));
task("build-production", series("clean", "compile-production"));
//PR CHECK
task("validate-quote-json-schema", function () {
return JSONValidation.validateQuotes();
});
task("validate-language-json-schema", function () {
return JSONValidation.validateLanguages();
});
task("validate-other-json-schema", function () {
return JSONValidation.validateOthers();
});
task("pr-check-lint-json", series("lint-json"));
task("pr-check-quote-json", series("validate-quote-json-schema"));
task("pr-check-language-json", series("validate-language-json-schema"));
task("pr-check-other-json", series("validate-other-json-schema"));
task("pr-check-lint", series("lint"));
task("pr-check-scss", series("sass"));
task("pr-check-ts", series("webpack-production"));