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;