-
Notifications
You must be signed in to change notification settings - Fork 1
/
.eleventy.js
132 lines (115 loc) · 3.56 KB
/
.eleventy.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
122
123
124
125
126
127
128
129
130
131
132
const pluginWebc = require("@11ty/eleventy-plugin-webc");
const bundlerPlugin = require("@11ty/eleventy-plugin-bundle");
const { Transform } = require("stream");
// Libs for transforming output
const esbuild = require("esbuild");
const { minify: minifyCSS } = require("csso");
const { minify: minifyHTML } = require("html-minifier-terser");
class TransformStream extends Transform {
constructor(transformFunction) {
super();
this._transform = (chunk, enc, done) =>
transformFunction(this, chunk, done);
}
}
const IS_PRODUCTION = process.env.NODE_ENV === "prod";
module.exports = (eleventyConfig) => {
// Set up webc plugin to process all webc files
eleventyConfig.addPlugin(pluginWebc, {
components: ["src/_components/**/*.webc"],
});
eleventyConfig.addWatchTarget("src/**/*.{js,mjs,css}");
// Pass through word files and manifest without any processing
eleventyConfig.addPassthroughCopy({
"src/words": "words",
});
eleventyConfig.addPassthroughCopy(
{
"src/pwa/serviceWorker.js": "sw.js",
},
{
transform: () =>
new TransformStream((stream, chunk, done) =>
esbuild
.transform(chunk.toString(), { minify: true })
.then((result) => done(null, result.code))
),
}
);
eleventyConfig.addPassthroughCopy(
{
"src/pwa/manifest.json": "manifest.json",
},
{
transform: () =>
new TransformStream((stream, chunk, done) =>
done(null, JSON.stringify(JSON.parse(chunk.toString())))
),
}
);
eleventyConfig.addPassthroughCopy({ "src/pwa/**/*.png": "/" });
// Apply custom transforms to bundled JS and CSS
eleventyConfig.addPlugin(bundlerPlugin, {
transforms: [
async function (content) {
switch (this.type) {
case "js":
try {
let unminifiedCode = content;
// Wrap AlpineJS code in an Alpine init event listener
const [bucket] = this.buckets;
if (bucket === "alpine") {
unminifiedCode = /* js */ `
const importAlpine = import("https://cdn.jsdelivr.net/npm/[email protected]/dist/module.esm.js/+esm");
document.addEventListener("alpine:init", () => {${unminifiedCode}});
const a = (await importAlpine).default;
window.Alpine = a;
a.start();
`;
}
// Minify the JS bundle
return (
await esbuild.transform(unminifiedCode, {
minify: IS_PRODUCTION,
})
).code;
} catch (e) {
console.error("Error while minifying JS bundle:", e);
}
break;
case "css":
try {
// Minify the CSS bundle
return minifyCSS(content).css;
} catch (e) {
console.error("Error while minifying CSS bundle:", e);
}
break;
default:
}
return content;
},
],
});
// Minify the HTML output
eleventyConfig.addTransform("htmlmin", async function (content) {
if (this.page.outputPath && this.page.outputPath.endsWith(".html")) {
try {
return await minifyHTML(content, {
useShortDoctype: true,
removeComments: true,
collapseWhitespace: true,
});
} catch (e) {
console.error("HTML minification error: ", e);
return content;
}
}
return content;
});
return {
dir: {
input: "src",
},
};
};