-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path.eleventy.js
145 lines (131 loc) · 3.65 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
133
134
135
136
137
138
139
140
141
142
143
144
145
// 11ty plugins
import pluginWebc from "@11ty/eleventy-plugin-webc";
import { eleventyImagePlugin } from "@11ty/eleventy-img";
import bundlerPlugin from "@11ty/eleventy-plugin-bundle";
// Minification/asset processing libs
import sharp from "sharp";
import esbuild from "esbuild";
import { minify as minifyCSS } from "csso";
import { minify as minifyHTML } from "html-minifier-terser";
import { readdir, mkdir } from "node:fs/promises";
const IS_PRODUCTION = process.env.NODE_ENV === "prod";
/**
* @param {import("@11ty/eleventy").UserConfig} eleventyConfig
*/
export default function (eleventyConfig) {
// Set up webc plugin to process all webc files
eleventyConfig.addPlugin(pluginWebc, {
components: [
"src/_components/**/*.webc",
"npm:@11ty/eleventy-img/*.webc",
"npm:@11ty/is-land/**/*.webc",
],
});
// Trigger a hot reload when a JS/CSS file changes
eleventyConfig.addWatchTarget("src/**/*.{js,mjs,css}");
eleventyConfig.addPassthroughCopy({
"src/assets/fonts": "/fonts",
"src/assets/img/favicon.png": "/img/favicon.png",
"src/assets/img/og.jpg": "/img/og.jpg",
"src/assets/**/*.pdf": "/",
"src/assets/video": "/video",
"src/assets/js": "/js",
});
// Image plugin
eleventyConfig.addPlugin(eleventyImagePlugin, {
formats: ["avif", "webp", "auto"],
widths: [320, 720, 1280, 1920],
urlPath: "/img/",
outputDir: "./_site/img/",
defaultAttributes: {
loading: "lazy",
decoding: "async",
},
});
const renderAttributeName = (name) => {
let result = "";
let prevChar;
for (let i = 0; i < name.length; ++i) {
const char = name[i];
if (
char === char.toUpperCase() &&
prevChar &&
prevChar === prevChar.toLowerCase()
) {
result += `-${char.toLowerCase()}`;
} else {
result += char.toLowerCase();
}
prevChar = char;
}
return result;
};
eleventyConfig.addJavaScriptFunction(
"renderAttributes",
/**
* @param {Record<string, unknown>} attributes
*/
(attributes) => {
return Object.entries(attributes)
.map(([key, value]) => `${renderAttributeName(key)}="${value}"`)
.join(" ");
}
);
// Apply custom transforms to bundled JS and CSS
eleventyConfig.addPlugin(bundlerPlugin, {
transforms: [
async function (content) {
switch (this.type) {
case "js":
try {
// Minify the JS bundle for production builds
return (
await esbuild.transform(content, {
minify: IS_PRODUCTION,
target: "es2020",
})
).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 (
IS_PRODUCTION &&
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",
},
};
}