1*5be3f65cSAndroid Build Coastguard Worker/** 2*5be3f65cSAndroid Build Coastguard Worker * Copyright (c) Meta Platforms, Inc. and affiliates. 3*5be3f65cSAndroid Build Coastguard Worker * 4*5be3f65cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*5be3f65cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*5be3f65cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*5be3f65cSAndroid Build Coastguard Worker * 8*5be3f65cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*5be3f65cSAndroid Build Coastguard Worker * 10*5be3f65cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*5be3f65cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*5be3f65cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*5be3f65cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*5be3f65cSAndroid Build Coastguard Worker * limitations under the License. 15*5be3f65cSAndroid Build Coastguard Worker */ 16*5be3f65cSAndroid Build Coastguard Worker 17*5be3f65cSAndroid Build Coastguard Worker/* Forked from https://microsoft.github.io/monaco-editor/ */ 18*5be3f65cSAndroid Build Coastguard Worker 19*5be3f65cSAndroid Build Coastguard Workerconst gulp = require("gulp"); 20*5be3f65cSAndroid Build Coastguard Workerconst es = require("event-stream"); 21*5be3f65cSAndroid Build Coastguard Workerconst path = require("path"); 22*5be3f65cSAndroid Build Coastguard Workerconst fs = require("fs"); 23*5be3f65cSAndroid Build Coastguard Workerconst os = require('os'); 24*5be3f65cSAndroid Build Coastguard Workerconst rimraf = require("rimraf"); 25*5be3f65cSAndroid Build Coastguard Workerconst cp = require("child_process"); 26*5be3f65cSAndroid Build Coastguard Workerconst CleanCSS = require("clean-css"); 27*5be3f65cSAndroid Build Coastguard Workerconst uncss = require("uncss"); 28*5be3f65cSAndroid Build Coastguard Worker 29*5be3f65cSAndroid Build Coastguard Workerconst VERSION = fs.readFileSync("../version.txt", "utf-8").trim(); 30*5be3f65cSAndroid Build Coastguard Worker 31*5be3f65cSAndroid Build Coastguard Workerallow_deploy_to_github = process.env.KTFMT_WEBSITE_ALLOW_DEPLOY_TO_GITHUB == '1'; 32*5be3f65cSAndroid Build Coastguard Workeroutdir = process.env.KTFMT_WEBSITE_OUTPUT_DIR || path.join(__dirname, '../release-ktfmt-website'); 33*5be3f65cSAndroid Build Coastguard Workerconsole.log('Using output dir: ' + outdir) 34*5be3f65cSAndroid Build Coastguard Worker 35*5be3f65cSAndroid Build Coastguard Worker// --- website 36*5be3f65cSAndroid Build Coastguard Workerconst cleanWebsiteTask = function (cb) { 37*5be3f65cSAndroid Build Coastguard Worker rimraf(outdir, { maxBusyTries: 1 }, cb); 38*5be3f65cSAndroid Build Coastguard Worker}; 39*5be3f65cSAndroid Build Coastguard Workerconst buildWebsiteTask = function () { 40*5be3f65cSAndroid Build Coastguard Worker function replaceWithRelativeResource(dataPath, contents, regex, callback) { 41*5be3f65cSAndroid Build Coastguard Worker return contents.replace(regex, function (_, m0) { 42*5be3f65cSAndroid Build Coastguard Worker var filePath = path.join(path.dirname(dataPath), m0); 43*5be3f65cSAndroid Build Coastguard Worker return callback(m0, fs.readFileSync(filePath)); 44*5be3f65cSAndroid Build Coastguard Worker }); 45*5be3f65cSAndroid Build Coastguard Worker } 46*5be3f65cSAndroid Build Coastguard Worker 47*5be3f65cSAndroid Build Coastguard Worker var waiting = 0; 48*5be3f65cSAndroid Build Coastguard Worker var done = false; 49*5be3f65cSAndroid Build Coastguard Worker 50*5be3f65cSAndroid Build Coastguard Worker return es 51*5be3f65cSAndroid Build Coastguard Worker .merge( 52*5be3f65cSAndroid Build Coastguard Worker gulp 53*5be3f65cSAndroid Build Coastguard Worker .src(["**/*"], { 54*5be3f65cSAndroid Build Coastguard Worker dot: true, 55*5be3f65cSAndroid Build Coastguard Worker ignore: [ 56*5be3f65cSAndroid Build Coastguard Worker "package.json", 57*5be3f65cSAndroid Build Coastguard Worker "package-lock.json", 58*5be3f65cSAndroid Build Coastguard Worker "node_modules/**/*", 59*5be3f65cSAndroid Build Coastguard Worker "gulpfile.js", 60*5be3f65cSAndroid Build Coastguard Worker '.DS_Store', 61*5be3f65cSAndroid Build Coastguard Worker ], 62*5be3f65cSAndroid Build Coastguard Worker }) 63*5be3f65cSAndroid Build Coastguard Worker .pipe( 64*5be3f65cSAndroid Build Coastguard Worker es.through( 65*5be3f65cSAndroid Build Coastguard Worker function (data) { 66*5be3f65cSAndroid Build Coastguard Worker if (!data.contents || !/\.(html)$/.test(data.path)) { 67*5be3f65cSAndroid Build Coastguard Worker return this.emit("data", data); 68*5be3f65cSAndroid Build Coastguard Worker } 69*5be3f65cSAndroid Build Coastguard Worker 70*5be3f65cSAndroid Build Coastguard Worker var contents = data.contents.toString(); 71*5be3f65cSAndroid Build Coastguard Worker contents = contents.replace(/{{version}}/g, VERSION); 72*5be3f65cSAndroid Build Coastguard Worker contents = contents.replace( 73*5be3f65cSAndroid Build Coastguard Worker /{{year}}/g, 74*5be3f65cSAndroid Build Coastguard Worker new Date().getFullYear() 75*5be3f65cSAndroid Build Coastguard Worker ); 76*5be3f65cSAndroid Build Coastguard Worker 77*5be3f65cSAndroid Build Coastguard Worker var allCSS = ""; 78*5be3f65cSAndroid Build Coastguard Worker var tmpcontents = replaceWithRelativeResource( 79*5be3f65cSAndroid Build Coastguard Worker data.path, 80*5be3f65cSAndroid Build Coastguard Worker contents, 81*5be3f65cSAndroid Build Coastguard Worker /<link data-inline="yes-please" href="([^"]+)".*/g, 82*5be3f65cSAndroid Build Coastguard Worker function (m0, fileContents) { 83*5be3f65cSAndroid Build Coastguard Worker allCSS += fileContents.toString("utf8"); 84*5be3f65cSAndroid Build Coastguard Worker return ""; 85*5be3f65cSAndroid Build Coastguard Worker } 86*5be3f65cSAndroid Build Coastguard Worker ); 87*5be3f65cSAndroid Build Coastguard Worker tmpcontents = tmpcontents.replace(/<script.*/g, ""); 88*5be3f65cSAndroid Build Coastguard Worker tmpcontents = tmpcontents.replace(/<link.*/g, ""); 89*5be3f65cSAndroid Build Coastguard Worker 90*5be3f65cSAndroid Build Coastguard Worker waiting++; 91*5be3f65cSAndroid Build Coastguard Worker uncss( 92*5be3f65cSAndroid Build Coastguard Worker tmpcontents, 93*5be3f65cSAndroid Build Coastguard Worker { raw: allCSS }, 94*5be3f65cSAndroid Build Coastguard Worker function (err, output) { 95*5be3f65cSAndroid Build Coastguard Worker waiting--; 96*5be3f65cSAndroid Build Coastguard Worker 97*5be3f65cSAndroid Build Coastguard Worker if (!err) { 98*5be3f65cSAndroid Build Coastguard Worker output = new CleanCSS().minify(output).styles; 99*5be3f65cSAndroid Build Coastguard Worker var isFirst = true; 100*5be3f65cSAndroid Build Coastguard Worker contents = contents.replace( 101*5be3f65cSAndroid Build Coastguard Worker /<link data-inline="yes-please" href="([^"]+)".*/g, 102*5be3f65cSAndroid Build Coastguard Worker function (_, m0) { 103*5be3f65cSAndroid Build Coastguard Worker if (isFirst) { 104*5be3f65cSAndroid Build Coastguard Worker isFirst = false; 105*5be3f65cSAndroid Build Coastguard Worker return "<style>" + output + "</style>"; 106*5be3f65cSAndroid Build Coastguard Worker } 107*5be3f65cSAndroid Build Coastguard Worker return ""; 108*5be3f65cSAndroid Build Coastguard Worker } 109*5be3f65cSAndroid Build Coastguard Worker ); 110*5be3f65cSAndroid Build Coastguard Worker } 111*5be3f65cSAndroid Build Coastguard Worker 112*5be3f65cSAndroid Build Coastguard Worker // Inline javascript 113*5be3f65cSAndroid Build Coastguard Worker contents = replaceWithRelativeResource( 114*5be3f65cSAndroid Build Coastguard Worker data.path, 115*5be3f65cSAndroid Build Coastguard Worker contents, 116*5be3f65cSAndroid Build Coastguard Worker /<script data-inline="yes-please" src="([^"]+)".*/g, 117*5be3f65cSAndroid Build Coastguard Worker function (m0, fileContents) { 118*5be3f65cSAndroid Build Coastguard Worker return ( 119*5be3f65cSAndroid Build Coastguard Worker "<script>" + fileContents.toString("utf8") + "</script>" 120*5be3f65cSAndroid Build Coastguard Worker ); 121*5be3f65cSAndroid Build Coastguard Worker } 122*5be3f65cSAndroid Build Coastguard Worker ); 123*5be3f65cSAndroid Build Coastguard Worker 124*5be3f65cSAndroid Build Coastguard Worker data.contents = Buffer.from( 125*5be3f65cSAndroid Build Coastguard Worker contents.split(/\r\n|\r|\n/).join("\n") 126*5be3f65cSAndroid Build Coastguard Worker ); 127*5be3f65cSAndroid Build Coastguard Worker this.emit("data", data); 128*5be3f65cSAndroid Build Coastguard Worker 129*5be3f65cSAndroid Build Coastguard Worker if (done && waiting === 0) { 130*5be3f65cSAndroid Build Coastguard Worker this.emit("end"); 131*5be3f65cSAndroid Build Coastguard Worker } 132*5be3f65cSAndroid Build Coastguard Worker }.bind(this) 133*5be3f65cSAndroid Build Coastguard Worker ); 134*5be3f65cSAndroid Build Coastguard Worker }, 135*5be3f65cSAndroid Build Coastguard Worker function () { 136*5be3f65cSAndroid Build Coastguard Worker done = true; 137*5be3f65cSAndroid Build Coastguard Worker if (waiting === 0) { 138*5be3f65cSAndroid Build Coastguard Worker this.emit("end"); 139*5be3f65cSAndroid Build Coastguard Worker } 140*5be3f65cSAndroid Build Coastguard Worker } 141*5be3f65cSAndroid Build Coastguard Worker ) 142*5be3f65cSAndroid Build Coastguard Worker ) 143*5be3f65cSAndroid Build Coastguard Worker .pipe(gulp.dest(outdir)) 144*5be3f65cSAndroid Build Coastguard Worker ) 145*5be3f65cSAndroid Build Coastguard Worker .pipe( 146*5be3f65cSAndroid Build Coastguard Worker es.through( 147*5be3f65cSAndroid Build Coastguard Worker function (data) { 148*5be3f65cSAndroid Build Coastguard Worker this.emit("data", data); 149*5be3f65cSAndroid Build Coastguard Worker }, 150*5be3f65cSAndroid Build Coastguard Worker function () { 151*5be3f65cSAndroid Build Coastguard Worker // temporarily create package.json so that npm install doesn't bark 152*5be3f65cSAndroid Build Coastguard Worker fs.writeFileSync(path.join(outdir, 'package.json'), '{}'); 153*5be3f65cSAndroid Build Coastguard Worker fs.writeFileSync(path.join(outdir, '.nojekyll'), ''); 154*5be3f65cSAndroid Build Coastguard Worker cp.execSync('npm install [email protected]', { 155*5be3f65cSAndroid Build Coastguard Worker cwd: outdir 156*5be3f65cSAndroid Build Coastguard Worker }); 157*5be3f65cSAndroid Build Coastguard Worker rimraf.sync(path.join(outdir, 'node_modules/monaco-editor/dev')); 158*5be3f65cSAndroid Build Coastguard Worker rimraf.sync(path.join(outdir, 'node_modules/monaco-editor/esm')); 159*5be3f65cSAndroid Build Coastguard Worker fs.unlinkSync(path.join(outdir, 'package.json')); 160*5be3f65cSAndroid Build Coastguard Worker 161*5be3f65cSAndroid Build Coastguard Worker this.emit("end"); 162*5be3f65cSAndroid Build Coastguard Worker } 163*5be3f65cSAndroid Build Coastguard Worker ) 164*5be3f65cSAndroid Build Coastguard Worker ); 165*5be3f65cSAndroid Build Coastguard Worker} 166*5be3f65cSAndroid Build Coastguard WorkerbuildWebsiteSeries = gulp.series(cleanWebsiteTask, buildWebsiteTask); 167*5be3f65cSAndroid Build Coastguard Workergulp.task("build-website", buildWebsiteSeries); 168