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;