-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.js
121 lines (105 loc) · 3.79 KB
/
build.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/* eslint-env node */
"use strict";
var readline = require("readline"),
minimist = require("minimist"),
fs = require("fs-extra");
var fluid = require("infusion");
var UglifyJS = require("uglify-js");
var buildIndex = {
excludes: [
"index.html"
],
localSource: [
],
codeHeader: "",
codeFooter: "", // "\njQuery.noConflict()",
copy: [{
src: "src/html/template.html",
dest: "build/html/template.html"
}, {
src: "src/buildTest/index.html",
dest: "build/index.html"
}, {
src: "data/assessment_centre_locations.csv",
dest: "build/data/assessment_centre_locations.csv"
}]
};
var infusion_prefix = "node_modules/infusion";
var parsedArgs = minimist(process.argv.slice(2));
// minimist has a wierd undocumented pathway for options beginning "no" - https://github.com/substack/minimist/blob/master/index.js#L118
// We accept the option "--no-infusion" in order to exclude Infusion's files from the build
var noInfusion = parsedArgs.infusion === false;
var readLines = function (filename) {
var lines = [];
var togo = fluid.promise();
var rl = readline.createInterface({
input: fs.createReadStream(filename),
terminal: false
});
rl.on("line", function (line) {
lines.push(line);
});
rl.on("close", function () {
togo.resolve(lines);
});
rl.on("error", function (error) {
togo.reject(error);
});
return togo;
};
var filesToContentHash = function (allFiles, extension) {
var extFiles = allFiles.filter(function (file) {
return file.endsWith(extension);
});
var hash = fluid.transform(fluid.arrayToHash(extFiles), function (troo, filename) {
return fs.readFileSync(filename, "utf8");
});
return hash;
};
var computeAllFiles = function (buildIndex, nodeFiles) {
var withExcludes = nodeFiles.filter(function (oneFile) {
return !buildIndex.excludes.some(function (oneExclude) {
return oneFile.indexOf(oneExclude) !== -1;
});
});
var withInf = withExcludes.filter(function (oneFile) {
return !(noInfusion && oneFile.startsWith(infusion_prefix));
});
return withInf.concat(buildIndex.localSource);
};
var buildFromFiles = function (buildIndex, nodeFiles) {
var allFiles = computeAllFiles(buildIndex, nodeFiles);
nodeFiles.concat(buildIndex.localSource);
var jsHash = filesToContentHash(allFiles, ".js", noInfusion);
var fullJsHash = fluid.extend({header: buildIndex.codeHeader}, jsHash, {footer: buildIndex.codeFooter});
fluid.log("Minifying " + Object.keys(fullJsHash).length + " JS files ... ");
console.log("Sizes", fluid.transform(fullJsHash, function (file) {
return file.length;
}));
var minified = UglifyJS.minify(fullJsHash, {
mangle: false,
sourceMap: {
filename: "fluid-covid-map-viz.js",
url: "fluid-covid-map-viz.js.map"
}
});
fs.removeSync("build");
fs.ensureDirSync("build/js");
fs.writeFileSync("build/js/fluid-covid-map-viz.js", minified.code, "utf8");
fs.writeFileSync("build/js/fluid-covid-map-viz.js.map", minified.map);
var cssHash = filesToContentHash(allFiles, ".css", noInfusion);
var cssConcat = String.prototype.concat.apply("", Object.values(cssHash));
fs.ensureDirSync("build/css");
fs.writeFileSync("build/css/fluid-covid-map-viz-all.css", cssConcat);
buildIndex.copy.forEach(function (oneCopy) {
fs.copySync(oneCopy.src, oneCopy.dest);
});
fluid.log("Copied " + (buildIndex.copy.length + 3) + " files to " + fs.realpathSync("build"));
};
fluid.setLogging(true);
var linesPromise = readLines("topublish.txt");
linesPromise.then(function (lines) {
buildFromFiles(buildIndex, lines);
}, function (error) {
console.log(error);
});