xref: /aosp_15_r20/external/ktfmt/website/gulpfile.js (revision 5be3f65c8cf0e6db0a7e312df5006e8e93cdf9ec)
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