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