1import lume from "lume/mod.ts";
2import brotli from "lume/plugins/brotli.ts";
3import feed from "lume/plugins/feed.ts";
4import lightningcss from "lume/plugins/lightningcss.ts";
5import metas from "lume/plugins/metas.ts";
6import nav from "lume/plugins/nav.ts";
7import picture from "lume/plugins/picture.ts";
8import postcss from "lume/plugins/postcss.ts";
9import purgecss from "lume/plugins/purgecss.ts";
10import relations from "lume/plugins/relations.ts";
11import robots from "lume/plugins/robots.ts";
12import sitemap from "lume/plugins/sitemap.ts";
13import slugify_urls from "lume/plugins/slugify_urls.ts";
14import source_maps from "lume/plugins/source_maps.ts";
15import svgo from "lume/plugins/svgo.ts";
16import tailwindcss from "lume/plugins/tailwindcss.ts";
17import toml from "lume/plugins/toml.ts";
18import transform_images from "lume/plugins/transform_images.ts";
19
20import catppuccin from "npm:@catppuccin/tailwindcss";
21
22// Disabled Plugins:
23// import minify_html from "lume/plugins/minify_html.ts";
24// import og_images from "lume/plugins/og_images.ts";
25// import pagefind from "lume/plugins/pagefind.ts";
26// import sri from "lume/plugins/sri.ts";
27
28// To Add:
29// https://deno.land/x/lume_markdown_plugins@v0.8.0 (toc and footnotes plugins)
30// https://deno.land/x/lume_shiki@0.0.16
31
32const site = lume({
33 src: "./src",
34 location: new URL("https://blog.pyrox.dev"),
35});
36
37site.loadAssets([".css"]);
38site.copy([".woff2"]);
39
40site.use(metas());
41// site.use(minify_html({
42// options: {
43// keep_html_and_head_opening_tags: true,
44// keep_spaces_between_attributes: true
45// }
46// }));
47site.use(nav());
48site.use(picture());
49site.use(transform_images());
50site.use(relations());
51site.use(sitemap());
52site.use(slugify_urls());
53site.use(svgo());
54site.use(toml());
55
56// Tailwind CSS
57site.use(tailwindcss({
58 extensions: [".html", ".vto"],
59 options: {
60 plugins: [catppuccin],
61 safelist: ['latte']
62 }
63}))
64site.use(postcss())
65
66// RSS/JSON Feed Generation
67site.use(feed({
68 output: ["/blog.rss", "/blog.json"],
69 query: "type=blog",
70 sort: "date=desc",
71 info: {
72 title: "dish blog",
73 description: "dish's thoughts on many things",
74 published: new Date(),
75 lang: "en",
76 generator: true,
77 authorName: "dish",
78 authorUrl: "https://blog.pyrox.dev",
79 },
80 items: {
81 title: "=title",
82 description: "=summary",
83 published: "=published",
84 updated: "=updated || undefined",
85 content: "=children",
86 lang: "=lang",
87 image: "=banner",
88 authorName: "=author.name",
89 authorUrl: "=author.url",
90 },
91}));
92
93// CSS postprocessing
94site.use(purgecss())
95site.use(lightningcss({
96 options: {
97 minify: true,
98 bundle: false,
99 }
100}));
101
102// Source Map Generation
103site.use(source_maps());
104
105// Compress everything with Brotli
106site.use(brotli({
107 extensions: [
108 ".html",
109 ".css",
110 ".js",
111 ".mjs",
112 ".svg",
113 ".json",
114 ".xml",
115 ".txt",
116 ".rss",
117 ".map"
118 ]
119}));
120
121// robots.txt generation
122site.use(robots({
123 disallow: [
124 "AI2Bot",
125 "Amazonbot",
126 "Applebot-Extended",
127 "Bytespider",
128 "ChatGPT-User",
129 "ClaudeBot",
130 "Diffbot",
131 "DuckAssistBot",
132 "FacebookBot",
133 "GPTBot",
134 "Google-Extended",
135 "Meta-ExternalAgent",
136 "Meta-ExternalFetcher",
137 "OAI-SearchBot",
138 "Operator",
139 "PanguBot",
140 "PerplexityBot",
141 "SemrushBot",
142 "SemrushBot-OCOB",
143 "Timpibot",
144 "Webzio-Extended",
145 "YouBot",
146 "cohere-training-data-crawler",
147 "omgili",
148 "t3versions",
149 ]
150}));
151
152// Copy .well-known to site root
153site.copy("static/.well-known", ".well-known")
154
155// Get current commit as a version number
156// Taken from https://github.com/pixeldesu/pixelde.su/blob/main/_config.ts
157// Associated usage in src/_includes/components/footer.vto also from the above repo
158const commitCmd = new Deno.Command("git", { args: ["rev-parse", "HEAD"] });
159const { stdout } = await commitCmd.output();
160const commitHash = new TextDecoder().decode(stdout);
161site.data("commit", commitHash);
162
163export default site;