1import lume from "lume/mod.ts";
2import brotli from "lume/plugins/brotli.ts";
3import date from "lume/plugins/date.ts";
4import feed from "lume/plugins/feed.ts";
5import metas from "lume/plugins/metas.ts";
6import picture from "lume/plugins/picture.ts";
7import relations from "lume/plugins/relations.ts";
8import robots from "lume/plugins/robots.ts";
9import sitemap from "lume/plugins/sitemap.ts";
10import slugify_urls from "lume/plugins/slugify_urls.ts";
11import source_maps from "lume/plugins/source_maps.ts";
12import svgo from "lume/plugins/svgo.ts";
13import toml from "lume/plugins/toml.ts";
14import transform_images from "lume/plugins/transform_images.ts";
15
16// Markdown-it plugins
17import md_linenums from "npm:markdown-it-inject-linenumbers@0.3.0";
18
19// CSS
20// // Base dependencies
21import tailwindcss from "lume/plugins/tailwindcss.ts";
22import postcss from "lume/plugins/postcss.ts";
23import catppuccin from "npm:@catppuccin/tailwindcss";
24// // Fonts
25import googleFonts from "lume/plugins/google_fonts.ts";
26// // Optimization
27import lightningcss from "lume/plugins/lightningcss.ts";
28import purgecss from "lume/plugins/purgecss.ts";
29
30// Disabled Plugins:
31// import minify_html from "lume/plugins/minify_html.ts";
32// import og_images from "lume/plugins/og_images.ts";
33// import pagefind from "lume/plugins/pagefind.ts";
34// import sri from "lume/plugins/sri.ts";
35// import nav from "lume/plugins/nav.ts";
36
37// To Add:
38// https://deno.land/x/lume_markdown_plugins@v0.8.0 (toc and footnotes plugins)
39// https://deno.land/x/lume_shiki@0.0.16
40
41const mdConfig = {
42 plugins: [md_linenums],
43};
44
45const site = lume(
46 {
47 src: "./src",
48 location: new URL("https://blog.pyrox.dev"),
49 },
50 { mdConfig },
51);
52
53site.loadAssets([".css"]);
54site.copy([".woff2"]);
55
56site.use(metas());
57// site.use(minify_html({
58// options: {
59// keep_html_and_head_opening_tags: true,
60// keep_spaces_between_attributes: true
61// }
62// }));
63site.use(picture());
64site.use(transform_images());
65site.use(relations());
66site.use(sitemap());
67site.use(slugify_urls());
68site.use(svgo());
69site.use(toml());
70site.use(
71 date({
72 formats: {
73 SHORT_DATE: "yyyy-MM-dd",
74 POST_DATE: "dd MMM, yyyy",
75 },
76 }),
77);
78
79// Tailwind CSS
80site.use(
81 tailwindcss({
82 options: {
83 plugins: [catppuccin],
84 theme: {
85 fontFamily: {
86 sans: ["Inter", "ui-sans-serif", "system-ui", "sans-serif"],
87 serif: ["IBM Plex Serif", "ui-serif", "serif"],
88 },
89 },
90 },
91 }),
92);
93site.use(postcss());
94
95// Fonts
96site.use(
97 googleFonts({
98 subsets: ["latin", "latin-ext"],
99 folder: "/static/fonts/",
100 cssFile: "/static/fonts.css",
101 fonts:
102 "https://fonts.googleapis.com/css2?family=IBM+Plex+Serif:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900",
103 }),
104);
105
106// RSS/JSON Feed Generation
107site.use(
108 feed({
109 output: ["/blog.rss", "/blog.json"],
110 query: "category=blog",
111 info: {
112 title: "dish blog",
113 description: "dish's thoughts on many things",
114 published: new Date(),
115 lang: "en",
116 generator: true,
117 authorName: "dish",
118 authorUrl: "https://blog.pyrox.dev",
119 },
120 items: {
121 title: "=title",
122 description: "=summary",
123 published: "=published",
124 updated: "=updated",
125 content: "$.e-content",
126 lang: "=lang",
127 image: "=banner",
128 authorName: "=author.name",
129 authorUrl: "=author.url",
130 },
131 }),
132);
133
134// CSS postprocessing
135site.use(purgecss());
136site.use(
137 lightningcss({
138 options: {
139 minify: true,
140 bundle: false,
141 },
142 }),
143);
144
145// Source Map Generation
146site.use(source_maps());
147
148// Compress everything with Brotli
149site.use(
150 brotli({
151 extensions: [
152 ".html",
153 ".css",
154 ".js",
155 ".mjs",
156 ".svg",
157 ".json",
158 ".xml",
159 ".txt",
160 ".rss",
161 ".map",
162 ],
163 }),
164);
165
166// robots.txt generation
167site.use(
168 robots({
169 disallow: [
170 "AI2Bot",
171 "Amazonbot",
172 "Applebot-Extended",
173 "Bytespider",
174 "ChatGPT-User",
175 "ClaudeBot",
176 "Diffbot",
177 "DuckAssistBot",
178 "FacebookBot",
179 "GPTBot",
180 "Google-Extended",
181 "Meta-ExternalAgent",
182 "Meta-ExternalFetcher",
183 "OAI-SearchBot",
184 "Operator",
185 "PanguBot",
186 "PerplexityBot",
187 "SemrushBot",
188 "SemrushBot-OCOB",
189 "Timpibot",
190 "Webzio-Extended",
191 "YouBot",
192 "cohere-training-data-crawler",
193 "omgili",
194 "t3versions",
195 ],
196 }),
197);
198
199// Copy .well-known to site root
200site.copy("static/.well-known", ".well-known");
201
202// Get current commit as a version number
203// Taken from https://github.com/pixeldesu/pixelde.su/blob/main/_config.ts
204// Associated usage in src/_includes/components/footer.vto also from the above repo
205const commitCmd = new Deno.Command("git", { args: ["rev-parse", "HEAD"] });
206const { stdout } = await commitCmd.output();
207const commitHash = new TextDecoder().decode(stdout);
208site.data("commit", commitHash);
209
210export default site;