blob: dd0896927753282c8638fe9fc8f17763584b6135 [file] [log] [blame]
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* Forked from https://microsoft.github.io/monaco-editor/ */
const gulp = require("gulp");
const es = require("event-stream");
const path = require("path");
const fs = require("fs");
const os = require('os');
const rimraf = require("rimraf");
const cp = require("child_process");
const CleanCSS = require("clean-css");
const uncss = require("uncss");
const VERSION = fs.readFileSync("../version.txt", "utf-8").trim();
allow_deploy_to_github = process.env.KTFMT_WEBSITE_ALLOW_DEPLOY_TO_GITHUB == '1';
outdir = process.env.KTFMT_WEBSITE_OUTPUT_DIR || path.join(__dirname, '../release-ktfmt-website');
console.log('Using output dir: ' + outdir)
// --- website
const cleanWebsiteTask = function (cb) {
rimraf(outdir, { maxBusyTries: 1 }, cb);
};
const buildWebsiteTask = function () {
function replaceWithRelativeResource(dataPath, contents, regex, callback) {
return contents.replace(regex, function (_, m0) {
var filePath = path.join(path.dirname(dataPath), m0);
return callback(m0, fs.readFileSync(filePath));
});
}
var waiting = 0;
var done = false;
return es
.merge(
gulp
.src(["**/*"], {
dot: true,
ignore: [
"package.json",
"package-lock.json",
"node_modules/**/*",
"gulpfile.js",
'.DS_Store',
],
})
.pipe(
es.through(
function (data) {
if (!data.contents || !/\.(html)$/.test(data.path)) {
return this.emit("data", data);
}
var contents = data.contents.toString();
contents = contents.replace(/{{version}}/g, VERSION);
contents = contents.replace(
/{{year}}/g,
new Date().getFullYear()
);
var allCSS = "";
var tmpcontents = replaceWithRelativeResource(
data.path,
contents,
/<link data-inline="yes-please" href="([^"]+)".*/g,
function (m0, fileContents) {
allCSS += fileContents.toString("utf8");
return "";
}
);
tmpcontents = tmpcontents.replace(/<script.*/g, "");
tmpcontents = tmpcontents.replace(/<link.*/g, "");
waiting++;
uncss(
tmpcontents,
{ raw: allCSS },
function (err, output) {
waiting--;
if (!err) {
output = new CleanCSS().minify(output).styles;
var isFirst = true;
contents = contents.replace(
/<link data-inline="yes-please" href="([^"]+)".*/g,
function (_, m0) {
if (isFirst) {
isFirst = false;
return "<style>" + output + "</style>";
}
return "";
}
);
}
// Inline javascript
contents = replaceWithRelativeResource(
data.path,
contents,
/<script data-inline="yes-please" src="([^"]+)".*/g,
function (m0, fileContents) {
return (
"<script>" + fileContents.toString("utf8") + "</script>"
);
}
);
data.contents = Buffer.from(
contents.split(/\r\n|\r|\n/).join("\n")
);
this.emit("data", data);
if (done && waiting === 0) {
this.emit("end");
}
}.bind(this)
);
},
function () {
done = true;
if (waiting === 0) {
this.emit("end");
}
}
)
)
.pipe(gulp.dest(outdir))
)
.pipe(
es.through(
function (data) {
this.emit("data", data);
},
function () {
// temporarily create package.json so that npm install doesn't bark
fs.writeFileSync(path.join(outdir, 'package.json'), '{}');
fs.writeFileSync(path.join(outdir, '.nojekyll'), '');
cp.execSync('npm install monaco-editor@0.23', {
cwd: outdir
});
rimraf.sync(path.join(outdir, 'node_modules/monaco-editor/dev'));
rimraf.sync(path.join(outdir, 'node_modules/monaco-editor/esm'));
fs.unlinkSync(path.join(outdir, 'package.json'));
this.emit("end");
}
)
);
}
buildWebsiteSeries = gulp.series(cleanWebsiteTask, buildWebsiteTask);
gulp.task("build-website", buildWebsiteSeries);