feat(sterni/nix/build): add my simplistic nix website authoring tool

I am already using this outside of depot where it isn't under VCS. It
makes sense to canonicalize it, also to ensure that it stays somewhat
generic.

Change-Id: I5595d98ab4198794c395feb4d3c08df1e2d01a36
Reviewed-on: https://cl.tvl.fyi/c/depot/+/13184
Autosubmit: sterni <sternenseemann@systemli.org>
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
This commit is contained in:
sterni 2025-02-27 02:18:34 +01:00 committed by clbot
parent 34f6539a42
commit 984c930a7c
2 changed files with 60 additions and 10 deletions

View file

@ -15,16 +15,16 @@ in
services.nginx.virtualHosts."sterni.lv" = { services.nginx.virtualHosts."sterni.lv" = {
enableACME = true; enableACME = true;
forceSSL = true; forceSSL = true;
root = pkgs.writeTextFile { root = depot.users.sterni.nix.build.website "sterni.lv" { } {
name = "sterni.lv-http-root"; "index.html" = { ... }: pkgs.writeText "index.html" (
destination = "/index.html"; <html> { } [
text = <html> { } [
(<head> { } [ (<head> { } [
(<meta> { charset = "utf-8"; } null) (<meta> { charset = "utf-8"; } null)
(<title> { } "no thoughts") (<title> { } "no thoughts")
]) ])
(<body> { } "🦩") (<body> { } "🦩")
]; ]
);
}; };
# TODO(sterni): tmp.sterni.lv # TODO(sterni): tmp.sterni.lv
locations."/tmp/".root = toString /srv/http; locations."/tmp/".root = toString /srv/http;

View file

@ -0,0 +1,50 @@
# Experimental Nix Static Website Authoring Tool
#
# Proof of Concept for a Nix library that allows for authoring static websites
# in Nix in a relatively ad hoc way, i.e. no specific markup or structure
# requirements. In particular, the library can help with creating relative
# references between files/pages so that the website is fully relocatable via
# (relativeToRoot). I use this for fairly trivial websites at the moment though
# I'm not happy with the relative linking feature yet. The API is probably going
# to be redesigned to improve this—you have been warned.
{ depot, pkgs, lib, ... }:
# TODO(sterni): implement generic deploy script
# TODO(sterni): port orgPage to depot
# TODO(sterni): replace relativeToRoot with a fixpoint that exposes (relative) urls
let
inherit (lib)
isDerivation
;
inherit (depot.nix)
writeTree
utils
;
minify = type: file: pkgs.runCommandNoCC (utils.storePathName file)
{
nativeBuildInputs = [ pkgs.buildPackages.minify ];
env = { inherit file; };
}
''
minify --type ${type} < "$file" > "$out"
'';
makeWebsite = name: { args ? { } }: tree:
let
callTree = relativeToRoot: tree:
if builtins.isFunction tree then
tree (args // { inherit relativeToRoot; })
else if builtins.isAttrs tree && !(isDerivation tree) then
builtins.mapAttrs (_: v: callTree "${relativeToRoot}../" v) tree
else
tree;
in
writeTree name (builtins.mapAttrs (_: callTree "") tree);
in
{
__functor = _: makeWebsite;
inherit makeWebsite minify;
}