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