0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-01-07 15:39:42 -05:00
penpot/frontend/gulpfile.js

245 lines
6.2 KiB
JavaScript
Raw Normal View History

2020-01-11 10:28:54 -05:00
const fs = require("fs");
const path = require("path");
const l = require("lodash");
const CleanCSS = require("clean-css");
const gulp = require("gulp");
const gulpif = require("gulp-if");
const gzip = require("gulp-gzip");
const mustache = require("gulp-mustache");
const rename = require("gulp-rename");
const svgSprite = require("gulp-svg-sprite");
const mkdirp = require("mkdirp");
const rimraf = require("rimraf");
const sass = require("sass");
const autoprefixer = require("autoprefixer")
const postcss = require("postcss")
2016-06-11 13:43:57 -05:00
const paths = {};
paths.resources = "./resources/";
2016-02-21 09:42:35 -05:00
paths.output = "./resources/public/";
paths.dist = "./target/dist/";
paths.scss = "./resources/styles/**/*.scss";
2015-06-18 12:35:50 -05:00
2016-06-11 13:43:57 -05:00
/***********************************************
* Helpers
2016-06-11 13:43:57 -05:00
***********************************************/
function isProduction() {
return (process.env.NODE_ENV === "production");
}
function scssPipeline(options) {
const write = (_path, data) => {
return new Promise((resolve, reject) => {
fs.writeFile(_path, data, function(err) {
if (err) { reject(err); }
else { resolve(); }
});
});
};
const render = (input) => {
return new Promise((resolve, reject) => {
sass.render({file: input}, async function(err, result) {
if (err) {
console.log(err.formatted);
reject(err);
} else {
resolve(result.css);
}
});
});
};
const postprocess = (data, input, output) => {
return postcss([autoprefixer])
.process(data, {map: false, from: input, to: output})
};
return function(next) {
const input = options.input;
const output = options.output;
return mkdirp(path.dirname(output))
.then(() => render(input))
.then((res) => postprocess(res, input, output))
.then((res) => write(output, res))
.catch((err) => null)
.then(() => {
next();
});
};
2016-04-03 05:19:11 -05:00
}
2016-02-21 09:42:35 -05:00
// Templates
2016-04-03 05:19:11 -05:00
2020-01-11 10:28:54 -05:00
function readLocales() {
const path = __dirname + "/resources/locales.json";
const content = JSON.parse(fs.readFileSync(path, {encoding: "utf8"}));
let result = {};
for (let key of Object.keys(content)) {
const item = content[key];
if (l.isString(item)) {
result[key] = {"en": item};
} else if (l.isPlainObject(item) && l.isPlainObject(item.translations)) {
result[key] = item.translations;
}
}
return JSON.stringify(result);
}
2020-04-18 13:34:34 -05:00
function readConfig(data) {
const googleClientID = process.env.UXBOX_GOOGLE_CLIENT_ID;
const publicURI = process.env.UXBOX_PUBLIC_URI;
const backendURI = process.env.UXBOX_BACKEND_URI;
const demoWarn = process.env.UXBOX_DEMO_WARNING;
const deployDate = process.env.UXBOX_DEPLOY_DATE;
const deployCommit = process.env.UXBOX_DEPLOY_COMMIT;
let cfg = {
demoWarning: demoWarn === "true"
};
if (googleClientID !== undefined) {
cfg.googleClientID = googleClientID;
}
if (publicURI !== undefined) {
cfg.publicURI = publicURI;
}
if (backendURI !== undefined) {
cfg.backendURI = backendURI;
}
if (deployDate !== undefined) {
cfg.deployDate = deployDate;
}
if (deployCommit !== undefined) {
cfg.deployCommit = deployCommit;
}
2020-04-18 13:34:34 -05:00
Object.assign(cfg, data);
return JSON.stringify(cfg);
}
function templatePipeline(options) {
return function() {
const input = options.input;
const output = options.output;
const ts = Math.floor(new Date());
const th = process.env.UXBOX_THEME || "default";
const themes = ["default"];
2020-01-11 10:28:54 -05:00
const locales = readLocales();
2020-04-18 13:34:34 -05:00
const config = readConfig({themes});
2020-01-11 10:28:54 -05:00
const tmpl = mustache({
2020-01-11 10:28:54 -05:00
ts: ts,
2020-04-08 03:57:29 -05:00
th: th,
config: JSON.stringify(config),
translations: JSON.stringify(locales),
2020-04-08 03:57:29 -05:00
themes: JSON.stringify(themes),
});
2016-06-11 13:43:57 -05:00
return gulp.src(input)
.pipe(tmpl)
.pipe(rename("index.html"))
.pipe(gulp.dest(output));
};
}
/***********************************************
* Generic
***********************************************/
gulp.task("scss:main-default", scssPipeline({
input: paths.resources + "styles/main-default.scss",
output: paths.output + "css/main-default.css"
2020-04-08 03:57:29 -05:00
}));
gulp.task("scss", gulp.parallel("scss:main-default"));
gulp.task("svg:sprite", function() {
return gulp.src(paths.resources + "images/icons/*.svg")
.pipe(rename({prefix: "icon-"}))
.pipe(svgSprite({mode:{symbol: {inline: false}}}))
.pipe(gulp.dest(paths.output + "images/svg-sprite/"));
});
gulp.task("template:main", templatePipeline({
input: paths.resources + "templates/index.mustache",
output: paths.output
}));
gulp.task("templates", gulp.series("template:main"));
2016-06-11 13:43:57 -05:00
/***********************************************
* Development
2016-06-11 13:43:57 -05:00
***********************************************/
2020-04-18 13:34:34 -05:00
gulp.task("clean", function(next) {
rimraf(paths.output, next);
2016-06-11 13:43:57 -05:00
});
2020-04-18 13:34:34 -05:00
gulp.task("copy:assets:images", function() {
return gulp.src(paths.resources + "images/**/*")
.pipe(gulp.dest(paths.output + "images/"));
});
2016-06-11 13:43:57 -05:00
2020-04-18 13:34:34 -05:00
gulp.task("copy:assets:fonts", function() {
return gulp.src(paths.resources + "fonts/**/*")
.pipe(gulp.dest(paths.output + "fonts/"));
});
2016-06-11 13:43:57 -05:00
2020-04-18 13:34:34 -05:00
gulp.task("copy:assets", gulp.parallel("copy:assets:images", "copy:assets:fonts"));
gulp.task("dev:dirs", function(next) {
mkdirp("./resources/public/css/").then(() => next())
});
gulp.task("watch:main", function() {
gulp.watch(paths.scss, gulp.series("scss"));
gulp.watch(paths.resources + "images/**/*",
2020-04-18 13:34:34 -05:00
gulp.series("svg:sprite", "copy:assets:images"));
gulp.watch([paths.resources + "templates/*.mustache",
paths.resources + "locales.json"],
gulp.series("templates"));
});
2020-04-18 13:34:34 -05:00
gulp.task("build", gulp.parallel("scss", "svg:sprite", "templates", "copy:assets"));
gulp.task("watch", gulp.series(
"dev:dirs",
2020-04-18 13:34:34 -05:00
"build",
"watch:main"
));
/***********************************************
* Production
***********************************************/
gulp.task("dist:clean", function(next) {
rimraf(paths.dist, next);
});
gulp.task("dist:copy", function() {
return gulp.src(paths.output + "**/*")
.pipe(gulp.dest(paths.dist));
2016-02-21 11:01:27 -05:00
});
gulp.task("dist:gzip", function() {
return gulp.src(`${paths.dist}**/!(*.gz|*.br|*.jpg|*.png)`)
.pipe(gzip({gzipOptions: {level: 9}}))
.pipe(gulp.dest(paths.dist));
});