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