diff --git a/package-lock.json b/package-lock.json index 3359222..7681aca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "eleventy-favicon": "^1.1.2", "eleventy-plugin-toc": "^1.1.5", "fs-file-tree": "^1.1.1", + "glob": "^8.1.0", "gray-matter": "^4.0.3", "lunr": "^2.3.9", "markdown-it": "^13.0.1", @@ -795,8 +796,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -2237,8 +2237,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", @@ -2333,20 +2332,18 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2364,6 +2361,25 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -2660,7 +2676,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3154,6 +3169,26 @@ "node": ">=10" } }, + "node_modules/js-beautify/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -4260,7 +4295,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4953,6 +4988,26 @@ "rimraf": "bin.js" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7091,8 +7146,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -8223,8 +8277,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -8297,17 +8350,33 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "glob-parent": { @@ -8525,7 +8594,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -8893,6 +8961,22 @@ "editorconfig": "^0.15.3", "glob": "^7.1.3", "nopt": "^5.0.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "js-stringify": { @@ -9757,7 +9841,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -10319,6 +10403,22 @@ "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "run-parallel": { diff --git a/package.json b/package.json index 8b839ee..dbeefce 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "description": "", "main": "index.js", "scripts": { - "start": "npm-run-all build:sass --parallel watch:*", + "start": "npm-run-all get-theme build:sass --parallel watch:*", "watch:sass": "sass --watch src/site/styles:dist/styles", "watch:eleventy": "cross-env ELEVENTY_ENV=dev eleventy --serve", "build:eleventy": "cross-env ELEVENTY_ENV=prod NODE_OPTIONS=--max-old-space-size=4096 eleventy", "build:sass": "sass src/site/styles:dist/styles", - "build": "npm-run-all build:*", + "get-theme": "node src/site/get-theme.js", + "build": "npm-run-all get-theme build:*", "postbuild": "node src/site/lunr-index.js" }, "keywords": [], @@ -31,6 +32,7 @@ "eleventy-favicon": "^1.1.2", "eleventy-plugin-toc": "^1.1.5", "fs-file-tree": "^1.1.1", + "glob": "^8.1.0", "gray-matter": "^4.0.3", "lunr": "^2.3.9", "markdown-it": "^13.0.1", diff --git a/src/site/_data/meta.js b/src/site/_data/meta.js index 9feb10c..9c4c5f2 100644 --- a/src/site/_data/meta.js +++ b/src/site/_data/meta.js @@ -1,39 +1,26 @@ require("dotenv").config(); const axios = require("axios"); +const fs = require("fs"); +const crypto = require("crypto"); +const glob = require("glob"); +module.exports = async () => { + let baseUrl = process.env.SITE_BASE_URL || ""; + if (baseUrl && !baseUrl.startsWith("http")) { + baseUrl = "https://" + baseUrl; + } + let themeStyle = glob.sync("src/site/styles/theme.*.css")[0] || ""; + if (themeStyle) { + themeStyle = themeStyle.split("site")[1]; + } + const meta = { + env: process.env.ELEVENTY_ENV, + theme: process.env.THEME, + themeStyle, + baseTheme: process.env.BASE_THEME || "dark", + siteName: process.env.SITE_NAME_HEADER || "Digital Garden", + siteBaseUrl: baseUrl, + }; -module.exports = async() => { - let themeStyle = ""; - let themeUrl = process.env.THEME; - if (themeUrl) { - //https://forum.obsidian.md/t/1-0-theme-migration-guide/42537 - //Not all themes with no legacy mark have a theme.css file, so we need to check for it - try{ - await axios.get(themeUrl); - }catch{ - if(themeUrl.indexOf("theme.css") > -1){ - themeUrl = themeUrl.replace("theme.css", "obsidian.css"); - } - else if(themeUrl.indexOf("obsidian.css") > -1){ - themeUrl = themeUrl.replace("obsidian.css", "theme.css"); - } - } - - const res = await axios.get(themeUrl); - themeStyle = ``; - } - let baseUrl = process.env.SITE_BASE_URL || ""; - if(baseUrl && !baseUrl.startsWith("http")){ - baseUrl = "https://" + baseUrl; - } - const meta ={ - env: process.env.ELEVENTY_ENV, - theme: process.env.THEME, - themeStyle: themeStyle, - baseTheme: process.env.BASE_THEME || "dark", - siteName: process.env.SITE_NAME_HEADER || "Digital Garden", - siteBaseUrl: baseUrl, - }; - - return meta; + return meta; }; diff --git a/src/site/get-theme.js b/src/site/get-theme.js new file mode 100644 index 0000000..f752516 --- /dev/null +++ b/src/site/get-theme.js @@ -0,0 +1,39 @@ +require("dotenv").config(); +const axios = require("axios"); +const fs = require("fs"); +const crypto = require("crypto"); +const glob = require("glob"); + +async function getTheme() { + let themeUrl = process.env.THEME; + if (themeUrl) { + //https://forum.obsidian.md/t/1-0-theme-migration-guide/42537 + //Not all themes with no legacy mark have a theme.css file, so we need to check for it + try { + await axios.get(themeUrl); + } catch { + if (themeUrl.indexOf("theme.css") > -1) { + themeUrl = themeUrl.replace("theme.css", "obsidian.css"); + } else if (themeUrl.indexOf("obsidian.css") > -1) { + themeUrl = themeUrl.replace("obsidian.css", "theme.css"); + } + } + + const res = await axios.get(themeUrl); + try { + const existing = glob.sync("src/site/styles/theme.*.css"); + existing.forEach((file) => { + fs.rmSync(file); + }); + } catch {} + const hashSum = crypto.createHash("sha256"); + hashSum.update(res.data); + const hex = hashSum.digest("hex"); + fs.writeFileSync( + `src/site/styles/theme.${hex.substring(0, 8)}.css`, + res.data + ); + } +} + +getTheme();