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;