1import lume from "lume/mod.ts"; 2import date from "lume/plugins/date.ts"; 3import picture from "lume/plugins/picture.ts"; 4import source_maps from "lume/plugins/source_maps.ts"; 5import toml from "lume/plugins/toml.ts"; 6 7// URL Management 8import slugify_urls from "lume/plugins/slugify_urls.ts"; 9import resolveUrls from "lume/plugins/resolve_urls.ts"; 10 11// File Generation 12import feed from "lume/plugins/feed.ts"; 13import metas from "lume/plugins/metas.ts"; 14import robots from "lume/plugins/robots.ts"; 15import sitemap from "lume/plugins/sitemap.ts"; 16 17// Optimization 18import brotli from "lume/plugins/brotli.ts"; 19import gzip from "lume/plugins/gzip.ts"; 20import minify_html from "lume/plugins/minify_html.ts"; 21import svgo from "lume/plugins/svgo.ts"; 22import transform_images from "lume/plugins/transform_images.ts"; 23 24// Markdown-it plugins 25import { BiDirectionalLinks } from "@nolebase/markdown-it-bi-directional-links"; 26import { default as mdItObsidianCallouts } from "markdown-it-obsidian-callouts"; 27 28// Additional external plugins 29import toc from "lume_markdown_plugins/toc.ts"; 30import footnotes from "lume_markdown_plugins/footnotes.ts"; 31import anchor from "npm:markdown-it-anchor"; 32import slugify from "npm:@sindresorhus/slugify"; 33 34// CSS 35// // Base dependencies 36import tailwindcss from "lume/plugins/tailwindcss.ts"; 37// // Fonts 38import googleFonts from "lume/plugins/google_fonts.ts"; 39// // Optimization 40import lightningcss from "lume/plugins/lightningcss.ts"; 41 42// Custom Plugins 43import validateHTML from "./plugins/validateHTML.ts"; 44import openInEditor from "./plugins/openInEditor.ts"; 45 46// Disabled Plugins: 47// import nav from "lume/plugins/nav.ts"; 48// import og_images from "lume/plugins/og_images.ts"; 49// import pagefind from "lume/plugins/pagefind.ts"; 50// import purgecss from "lume/plugins/purgecss.ts"; 51// import relations from "lume/plugins/relations.ts"; 52// import sri from "lume/plugins/sri.ts"; 53 54// To Add: 55// https://deno.land/x/lume_markdown_plugins@v0.8.0 (footnotes plugins) 56// https://deno.land/x/lume_shiki@0.0.16 57 58const site = lume({ 59 src: "./src", 60 location: new URL("https://pyrox.dev"), 61}, { 62 markdown: { 63 plugins: [ 64 [BiDirectionalLinks, { 65 dir: Deno.cwd() + "/src/", 66 stillRenderNoMatched: false, 67 }], 68 mdItObsidianCallouts, 69 [anchor, { 70 permalink: anchor.permalink.headerLink(), 71 slugify: (s: string) => slugify(s), 72 }], 73 ], 74 }, 75}); 76 77// Copy Static Files 78site.add(".css"); 79site.add("static/.well-known", ".well-known"); 80site.add(".woff2"); 81// Tailwind CSS 82site.use(tailwindcss()); 83 84// Fonts 85site.use( 86 googleFonts({ 87 subsets: ["latin", "latin-ext"], 88 folder: "/static/fonts/", 89 cssFile: "/static/fonts.css", 90 fonts: 91 "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", 92 }), 93); 94 95site.use(metas()); 96site.use(picture()); 97site.use(transform_images()); 98// site.use(relations()); 99site.use(sitemap()); 100site.use(slugify_urls()); 101site.use(svgo()); 102site.use(toml()); 103site.use( 104 date({ 105 formats: { 106 SHORT_DATE: "yyyy-MM-dd", 107 POST_DATE: "dd MMM, yyyy", 108 }, 109 }), 110); 111site.use(toc({ 112 anchor: false, 113})); 114site.use(resolveUrls()); 115 116// RSS/JSON Feed Generation 117site.use( 118 feed({ 119 output: ["/blog.rss", "/blog.json"], 120 query: "category=blog", 121 info: { 122 title: "dish blog", 123 description: "dish's thoughts on many things", 124 published: new Date(), 125 lang: "en", 126 generator: true, 127 authorName: "dish", 128 authorUrl: "https://blog.pyrox.dev", 129 }, 130 items: { 131 title: "=title", 132 description: "=summary", 133 published: "=published", 134 updated: "=updated", 135 content: "$.e-content", 136 lang: "=lang", 137 image: "=banner", 138 authorName: "=author.name", 139 authorUrl: "=author.url", 140 }, 141 }), 142); 143 144// CSS postprocessing 145// site.use(purgecss()); 146site.use(lightningcss({ 147 options: { 148 minify: true, 149 }, 150})); 151 152// Source Map Generation 153// Applies to CSS and JS 154site.use(source_maps()); 155 156site.use(validateHTML()); 157 158// Minify HTML Output 159site.use(minify_html({ 160 options: { 161 do_not_minify_doctype: true, 162 keep_closing_tags: false, 163 keep_html_and_head_opening_tags: true, 164 keep_spaces_between_attributes: true, 165 ensure_spec_compliant_unquoted_attribute_values: true, 166 keep_comments: false, 167 }, 168})); 169 170// robots.txt generation 171site.use( 172 robots({ 173 disallow: [ 174 "AI2Bot", 175 "Amazonbot", 176 "Applebot-Extended", 177 "Bytespider", 178 "ChatGPT-User", 179 "ClaudeBot", 180 "Diffbot", 181 "DuckAssistBot", 182 "FacebookBot", 183 "GPTBot", 184 "Google-Extended", 185 "Meta-ExternalAgent", 186 "Meta-ExternalFetcher", 187 "OAI-SearchBot", 188 "Operator", 189 "PanguBot", 190 "PerplexityBot", 191 "SemrushBot", 192 "SemrushBot-OCOB", 193 "Timpibot", 194 "Webzio-Extended", 195 "YouBot", 196 "cohere-training-data-crawler", 197 "omgili", 198 "t3versions", 199 ], 200 }), 201); 202 203// Compress everything with Brotli/Gzip 204site.use( 205 brotli({ 206 quality: 11, 207 extensions: [ 208 ".html", 209 ".css", 210 ".js", 211 ".mjs", 212 ".svg", 213 ".json", 214 ".xml", 215 ".txt", 216 ".rss", 217 ".map", 218 ], 219 }), 220); 221site.use( 222 gzip({ 223 extensions: [ 224 ".html", 225 ".css", 226 ".js", 227 ".mjs", 228 ".svg", 229 ".json", 230 ".xml", 231 ".txt", 232 ".rss", 233 ".map", 234 ], 235 }), 236); 237 238// Open in Editor in Dev mode 239site.data("production", Deno.env.get("PRODUCTION") == "true"); 240if (Deno.env.get("PRODUCTION") == "false") { 241 site.use(openInEditor()); 242 site.add("static/scripts/open-in-editor.js"); 243} 244 245// Get current commit as a version number 246// Taken from https://github.com/pixeldesu/pixelde.su/blob/main/_config.ts 247const commitCmd = new Deno.Command("git", { args: ["rev-parse", "HEAD"] }); 248const { stdout } = await commitCmd.output(); 249const commitHash = new TextDecoder().decode(stdout); 250site.data("commit", commitHash); 251 252export default site;