diff --git a/.eleventy.js b/.eleventy.js index 7377f83..915811c 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -3,6 +3,7 @@ const markdownItAttrs = require("markdown-it-attrs"); const autoprefixer = require("autoprefixer"); const markdownIt = require("markdown-it"); const htmlmin = require("html-minifier"); +const purgecss = require("purgecss"); const postcss = require("postcss"); const yaml = require("js-yaml"); const path = require("path"); @@ -14,6 +15,8 @@ const markdownLib = markdownIt({ linkify: true, }).use(markdownItAttrs); +const pattern = new RegExp("()", "gm"); + module.exports = function (eleventyConfig) { eleventyConfig.addDataExtension("yml", (contents) => yaml.load(contents)); eleventyConfig.addGlobalData("username", "Laureηt"); @@ -70,6 +73,27 @@ module.exports = function (eleventyConfig) { } }); + eleventyConfig.addTransform( + "purgestyle", + async function (content, outputPath) { + if ( + process.env.NODE_ENV === "production" && + outputPath && + outputPath.endsWith(".html") + ) { + const [{ css: result }] = await new purgecss.PurgeCSS().purge({ + content: [ + { raw: content.replace(pattern, "$1$3"), extension: "html" }, + ], + css: [{ raw: pattern.exec(content)[2] }], + }); + console.log(`[PURGECSS] ${outputPath} purged`); + return content.replace(pattern, ``); + } + return content; + } + ); + eleventyConfig.addShortcode("year", () => { const year = new Date().getFullYear(); return year.toString(); diff --git a/package.json b/package.json index faed6cc..599aca0 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "markdown-it-attrs": "^4.1.0", "npm-run-all": "^4.1.5", "postcss": "^8.4.5", + "purgecss": "^4.1.3", "sass": "^1.42.1" } } diff --git a/yarn.lock b/yarn.lock index 354bbba..fa86dc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -553,6 +553,11 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commander@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" @@ -634,6 +639,11 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1037,7 +1047,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.0.3, glob@^7.1.3: +glob@^7.0.3, glob@^7.1.3, glob@^7.1.7: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -1995,12 +2005,20 @@ portscanner@2.1.1: async "1.5.2" is-number-like "^1.0.3" +postcss-selector-parser@^6.0.6: + version "6.0.9" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" + integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.5: +postcss@^8.3.5, postcss@^8.4.5: version "8.4.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== @@ -2143,6 +2161,16 @@ pug@^3.0.2: pug-runtime "^3.0.1" pug-strip-comments "^2.0.0" +purgecss@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.1.3.tgz#683f6a133c8c4de7aa82fe2746d1393b214918f7" + integrity sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw== + dependencies: + commander "^8.0.0" + glob "^7.1.7" + postcss "^8.3.5" + postcss-selector-parser "^6.0.6" + qs@6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" @@ -2680,6 +2708,11 @@ upper-case@^1.1.1: resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"