-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.js
More file actions
117 lines (110 loc) · 2.96 KB
/
build.js
File metadata and controls
117 lines (110 loc) · 2.96 KB
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
const { readFileSync, writeFileSync, mkdirSync } = require("node:fs");
const { resolve } = require("node:path");
const get = require("lodash/fp/get.js");
const less = require("less");
const svgo = require("svgo");
const prettier = require("prettier");
const kefir = require("kefir");
const fs = require("node:fs");
const path = require("path");
const DIR_PUBLISH_PATH = "./publish";
const DIR_DATA_PATH = "./data";
const DIR_SRC_PATH = "./src";
const readFileSteam = (filename) =>
kefir
.fromNodeCallback((cb) => fs.readFile(filename, "utf8", cb))
.map(JSON.parse);
const pipeAsync = function (...funcs) {
return (initialValue) =>
funcs.reduce(
(promise, func) => promise.then(func),
Promise.resolve(initialValue),
);
};
const readAs =
(encType = "utf8") =>
(source) =>
readFileSync(source, encType);
const toBuffer =
(encType = "utf8") =>
(data) =>
Buffer.from(data, encType);
const writeTo = (destination) => (data) => writeFileSync(destination, data);
const basePublishDir = resolve(__dirname, DIR_PUBLISH_PATH);
const baseSrcDir = resolve(__dirname, DIR_SRC_PATH);
const baseDataDir = resolve(__dirname, DIR_DATA_PATH);
mkdirSync(basePublishDir, { recursive: true });
[
{
filename: "index.html",
transform: pipeAsync(
readAs("utf8"),
(html) =>
prettier.format(html, {
parser: "html",
singleQuote: false,
semi: true,
}),
toBuffer(),
writeTo(resolve(basePublishDir, "./index.html")),
),
},
{
filename: "print.less",
transform: pipeAsync(
readAs("utf8"),
(stylesheet) => less.render(stylesheet, { compress: true }),
get("css"),
toBuffer(),
writeTo(resolve(basePublishDir, "print.css")),
),
},
{
filename: "screen.less",
transform: pipeAsync(
readAs("utf8"),
(stylesheet) => less.render(stylesheet, { compress: true }),
get("css"),
toBuffer(),
writeTo(resolve(basePublishDir, "screen.css")),
),
},
{
filename: "logos.svg",
transform: pipeAsync(
readAs("utf8"),
(svgContent) => svgo.optimize(svgContent, {}).data,
toBuffer(),
writeTo(resolve(basePublishDir, "./logos.svg")),
),
},
{
filename: "robots.txt",
transform: pipeAsync(
readAs("utf8"),
toBuffer(),
writeTo(resolve(basePublishDir, "./robots.txt")),
),
},
{
transform: pipeAsync(
function () {
return kefir
.combine(
["profile", "company", "tag"].map((filename) =>
readFileSteam(
path.join(baseDataDir, [filename, "json"].join(".")),
),
),
(profile, company, tag) => ({ profile, company, tag }),
)
.toPromise();
},
JSON.stringify,
toBuffer(),
writeTo(resolve(basePublishDir, "./data.json")),
),
},
].forEach(async function ({ filename = "", transform }) {
transform(resolve(baseSrcDir, filename));
});