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