const fs = require("node:fs/promises"); const path = require("node:path"); const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); const { html: beautifyHtml } = require('js-beautify'); const data = { outputDirectory: "./out", navigationLinks: [ {link: "index.html", text: "home", name: "index"}, {link: "projects.html", text: "projects", name: "projects"}, {link: "https://git.hippoz.xyz", text: "git", name: "__ext_git"}, ], postProcessing: { beautifyOutput: true, beautifyOutputOptions: { indent_size: 2, preserve_newlines: false }, minifyOutputOptions: { indent_size: 0, preserve_newlines: false, end_with_newline: false, eol: "" } }, repositoryList: { gitTargetUsername: "hippoz", repositoryFetchUrl: `https://git.hippoz.xyz/api/v1/users/hippoz/repos?page=1&limit=100`, _cache: null, fetchProjects: async function() { if (this._cache) return this._cache; const response = await fetch(this.repositoryFetchUrl); const json = await response.json(); this._cache = json; return json; } }, navigationBrandingText: "hippoz." }; const linkButton = ({ link, text, selected=false }) => ` ${text} `; const navigation = ({currentName}) => ` `; const makePage = ({ name, description, title }) => content => [` ${title} ${navigation({currentName: name})}
${content}
`, content]; const indexPage = () => makePage({ title: "hippoz", description: "hippoz website homepage", name: "index", })(`

hippoz's website

i think

`); const projectsPage = async () => makePage({ title: "hippoz", description: "hippoz projects", name: "projects", })(` ${ (await data.repositoryList.fetchProjects()) .sort((a, b) => b.size - a.size) // biggest projects first .filter(a => !a.archived) .map( repo =>`
${repo.fork ? "🍴" : "📘"} ${repo.name} view >>
${repo.description ? `

${repo.description}

` : ""}
` ) .join("\n") } `); const pages = { "projects.html": projectsPage, "index.html": indexPage }; const renderPages = async () => { let renderedPages = {}; for (const [pageName, builder] of Object.entries(pages)) { renderedPages[pageName] = await builder(); } return renderedPages; }; const deployPages = async () => { const renderedPages = await renderPages(); for (let [pageName, content] of Object.entries(renderedPages)) { if (data.postProcessing.beautifyOutput) { content = beautifyHtml(content[0], data.postProcessing.beautifyOutputOptions); } await fs.writeFile(path.join(data.outputDirectory, pageName), content); } }; deployPages();