commit ea29c4d0f0037d49b5534d2ec0782d1c156687be
parent b454ffafebae3f52dd7f549dab0e878a2fc94748
Author: mtmn <miro@haravara.org>
Date: Sat, 2 May 2026 00:28:01 +0200
feat(nix): integrate elm2nix
Diffstat:
| A | elm.lock | | | 62 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | flake.lock | | | 76 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- |
| M | flake.nix | | | 344 | ++++++++++++++++++++++++++++++++++++------------------------------------------- |
3 files changed, 290 insertions(+), 192 deletions(-)
diff --git a/elm.lock b/elm.lock
@@ -0,0 +1,62 @@
+[
+ {
+ "author": "elm",
+ "package": "browser",
+ "version": "1.0.2",
+ "sha256": "0863nw2hhbpm3s03lm1imi5x28wwknzrwg2p79s5mydgvdvgwjf0"
+ },
+ {
+ "author": "elm",
+ "package": "bytes",
+ "version": "1.0.8",
+ "sha256": "0n411j2cyz9m241q6vszfzpq3fraradwal5m0gigp2505mdfpz3x"
+ },
+ {
+ "author": "elm",
+ "package": "core",
+ "version": "1.0.5",
+ "sha256": "0g3xbi8f9k5q45s95nx3jfvzwdf4b2n63a52wr4027d2xjx0pmvl"
+ },
+ {
+ "author": "elm",
+ "package": "file",
+ "version": "1.0.5",
+ "sha256": "0aimgicrdpys0v89m2wjx413561zil14cczjh6mkn9jcgckx6yng"
+ },
+ {
+ "author": "elm",
+ "package": "html",
+ "version": "1.0.1",
+ "sha256": "1m045b6cixyqygll4cjf9d9s3k1lj839kxc3gbid0fpqc4g10i6b"
+ },
+ {
+ "author": "elm",
+ "package": "http",
+ "version": "2.0.0",
+ "sha256": "0mfbz0lkfidmq5xpv5csw8943q0yrpvj0rwd2vb0gc8rbsfc9dg8"
+ },
+ {
+ "author": "elm",
+ "package": "json",
+ "version": "1.1.4",
+ "sha256": "0niq7id7r78ckvgap4psq0xdlnhcv1dz2j81lrnhl4fsgn0awvs8"
+ },
+ {
+ "author": "elm",
+ "package": "time",
+ "version": "1.0.0",
+ "sha256": "0wqa2vhl1zf8z0j2yd3yjwfhr0dydfns43bbzll3k4rhnjadxr1l"
+ },
+ {
+ "author": "elm",
+ "package": "url",
+ "version": "1.0.0",
+ "sha256": "1f2ij4i7zmijnj2i50qf19lpkr14bhms8dkq029inb5mydi9f8gs"
+ },
+ {
+ "author": "elm",
+ "package": "virtual-dom",
+ "version": "1.0.5",
+ "sha256": "16v6h8msm1yin45vwdj8g0wnqs4gjjyknhz2iamrzzbssxvryyqv"
+ }
+]
diff --git a/flake.lock b/flake.lock
@@ -1,5 +1,24 @@
{
"nodes": {
+ "elm2nix": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": "nixpkgs"
+ },
+ "locked": {
+ "lastModified": 1769795883,
+ "narHash": "sha256-JfLxMbns2wzu681/HwVcMqijP6dvdGkc6Efqq/UBQoA=",
+ "owner": "dwayne",
+ "repo": "elm2nix",
+ "rev": "e84ab8872f1660f5576df19adeb9e1a682402bb4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "dwayne",
+ "repo": "elm2nix",
+ "type": "github"
+ }
+ },
"flake-utils": {
"inputs": {
"systems": "systems"
@@ -13,6 +32,23 @@
"type": "github"
},
"original": {
+ "id": "flake-utils",
+ "type": "indirect"
+ }
+ },
+ "flake-utils_2": {
+ "inputs": {
+ "systems": "systems_2"
+ },
+ "locked": {
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "type": "github"
+ },
+ "original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
@@ -20,11 +56,25 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1776329215,
- "narHash": "sha256-a8BYi3mzoJ/AcJP8UldOx8emoPRLeWqALZWu4ZvjPXw=",
+ "lastModified": 1767364772,
+ "narHash": "sha256-fFUnEYMla8b7UKjijLnMe+oVFOz6HjijGGNS1l7dYaQ=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "b86751bc4085f48661017fa226dee99fab6c651b",
+ "rev": "16c7794d0a28b5a37904d55bcca36003b9109aaa",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_2": {
+ "locked": {
+ "lastModified": 1777548390,
+ "narHash": "sha256-WacE23EbHTsBKvr8cu+1DFNbP6Rh1brHUH5SDUI0NQI=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "7aaa00e7cc9be6c316cb5f6617bd740dd435c59d",
"type": "github"
},
"original": {
@@ -36,8 +86,9 @@
},
"root": {
"inputs": {
- "flake-utils": "flake-utils",
- "nixpkgs": "nixpkgs"
+ "elm2nix": "elm2nix",
+ "flake-utils": "flake-utils_2",
+ "nixpkgs": "nixpkgs_2"
}
},
"systems": {
@@ -54,6 +105,21 @@
"repo": "default",
"type": "github"
}
+ },
+ "systems_2": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
}
},
"root": "root",
diff --git a/flake.nix b/flake.nix
@@ -2,210 +2,180 @@
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
+ elm2nix.url = "github:dwayne/elm2nix";
};
+
outputs = {
self,
nixpkgs,
flake-utils,
- ...
+ elm2nix,
}:
- flake-utils.lib.eachDefaultSystem (system: let
- pkgs = nixpkgs.legacyPackages.${system};
-
- duckdbPrebuilt = pkgs.fetchurl {
- url = "https://npm.duckdb.org/duckdb/duckdb-v1.4.4-node-v137-linux-x64.tar.gz";
- hash = "sha256-Z91EJB81gRaZoLDjkw5lVVQ+jtGIvMV0tMJeOAY7Q3g=";
- };
-
- spagoRegistry = pkgs.fetchFromGitHub {
- owner = "purescript";
- repo = "registry";
- rev = "19f237b9f13c7b286ce2e7129d25d575db787bee";
- hash = "sha256-xC8+jSfKM/MmdmAqRQ44ccRFTAvpwAnnAVs4IRoDhL4=";
- };
-
- spagoRegistryIndex = pkgs.fetchFromGitHub {
- owner = "purescript";
- repo = "registry-index";
- rev = "77163eff5ea12e25d7391cf52fe5b9178145d843";
- hash = "sha256-ez73ecGmzf5d7EkamNZ9KT8u7e4yR7jSvdiGu4bGAHs=";
- };
-
- elmRegistry = pkgs.fetchFromGitHub {
- owner = "elm";
- repo = "package.elm-lang.org";
- rev = "afe1a128b4bbf5ec0ebc21886d32b0b473794a9e";
- hash = "sha256-aaflueHul/lXA/v8YM5Irckl8+jEUMsvkSS5nh9eYCg=";
- };
-
- elmDeps = pkgs.stdenv.mkDerivation {
- name = "corpus-elm-deps";
-
- src = pkgs.lib.cleanSourceWith {
- src = self;
- filter = name: _type: let
- baseName = baseNameOf (toString name);
- in
- pkgs.lib.elem baseName
- [
- "elm.json"
- "src"
- "Client.elm"
- "Api.elm"
- "State.elm"
- "Types.elm"
- "View.elm"
- ];
+ flake-utils.lib.eachDefaultSystem (
+ system: let
+ pkgs = nixpkgs.legacyPackages.${system};
+
+ inherit
+ (elm2nix.lib.elm2nix pkgs)
+ generateRegistryDat
+ prepareElmHomeScript
+ ;
+
+ duckdbPrebuilt = pkgs.fetchurl {
+ url = "https://npm.duckdb.org/duckdb/duckdb-v1.4.4-node-v137-linux-x64.tar.gz";
+ hash = "sha256-Z91EJB81gRaZoLDjkw5lVVQ+jtGIvMV0tMJeOAY7Q3g=";
};
- nativeBuildInputs = with pkgs; [elmPackages.elm cacert];
-
- outputHashAlgo = "sha256";
- outputHashMode = "recursive";
- outputHash = "sha256-3D0PJQH1AkHdt7eGmbplZBX1FXmS2hb36enYU7ajqY4=";
-
- buildPhase = ''
- export HOME=$TMPDIR
- export SSL_CERT_FILE="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
- export ELM_HOME=$HOME/.elm
+ spagoRegistry = pkgs.fetchFromGitHub {
+ owner = "purescript";
+ repo = "registry";
+ rev = "19f237b9f13c7b286ce2e7129d25d575db787bee";
+ hash = "sha256-xC8+jSfKM/MmdmAqRQ44ccRFTAvpwAnnAVs4IRoDhL4=";
+ };
- # Populate the Elm package registry from the fetched snapshot.
- mkdir -p $ELM_HOME/0.19.1/registry
- cp -r ${elmRegistry}/* $ELM_HOME/0.19.1/registry/
+ spagoRegistryIndex = pkgs.fetchFromGitHub {
+ owner = "purescript";
+ repo = "registry-index";
+ rev = "77163eff5ea12e25d7391cf52fe5b9178145d843";
+ hash = "sha256-ez73ecGmzf5d7EkamNZ9KT8u7e4yR7jSvdiGu4bGAHs=";
+ };
- elm make src/Client.elm --output=/dev/null
- '';
+ registryDat = generateRegistryDat {elmLock = ./elm.lock;};
- installPhase = ''
- mkdir -p $out
- cp -r $HOME/.elm/0.19.1/packages $out/
- '';
- };
+ elmHomeScript = prepareElmHomeScript {
+ elmLock = ./elm.lock;
+ inherit registryDat;
+ };
- spagoDeps = pkgs.stdenv.mkDerivation {
- name = "corpus-spago-deps";
+ spagoDeps = pkgs.stdenv.mkDerivation {
+ name = "corpus-spago-deps";
+
+ src = pkgs.lib.cleanSourceWith {
+ src = self;
+ filter = name: _type: let
+ baseName = baseNameOf (toString name);
+ in
+ pkgs.lib.elem baseName
+ [
+ "package.json"
+ "package-lock.json"
+ "spago.yaml"
+ "spago.lock"
+ ];
+ };
+
+ nativeBuildInputs = with pkgs; [nodejs git cacert purescript];
+
+ outputHashAlgo = "sha256";
+ outputHashMode = "recursive";
+ outputHash = "sha256-dBorhgF/CIngAe+6fvvGHnGkQsk070SDZbgF5xTGx9c=";
+
+ buildPhase = ''
+ export HOME=$TMPDIR
+ export SSL_CERT_FILE="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
+
+ mkdir -p $HOME/.cache/spago-nodejs
+ cp -r ${spagoRegistry} $HOME/.cache/spago-nodejs/registry
+ cp -r ${spagoRegistryIndex} $HOME/.cache/spago-nodejs/registry-index
+ chmod -R u+w $HOME/.cache/spago-nodejs
+
+ npm ci --ignore-scripts
+ patchShebangs node_modules
+ mkdir -p node_modules/.bin
+ ln -sf ${pkgs.purescript}/bin/purs node_modules/.bin/purs
+ npx spago install
+ '';
+
+ installPhase = ''
+ mkdir -p $out
+ cp -r .spago/p $out/packages
+ '';
+ };
src = pkgs.lib.cleanSourceWith {
src = self;
- filter = name: _type: let
+ filter = name: type: let
baseName = baseNameOf (toString name);
in
- pkgs.lib.elem baseName
- [
- "package.json"
- "package-lock.json"
- "spago.yaml"
- "spago.lock"
- ];
+ !((type == "directory" && (baseName == "docs" || baseName == ".git"))
+ || (type
+ == "regular"
+ && (
+ pkgs.lib.hasSuffix ".md" baseName
+ || baseName == "justfile"
+ || baseName == "flake.nix"
+ || baseName == "flake.lock"
+ )));
};
- nativeBuildInputs = with pkgs; [nodejs git cacert purescript];
-
- outputHashAlgo = "sha256";
- outputHashMode = "recursive";
- outputHash = "sha256-dBorhgF/CIngAe+6fvvGHnGkQsk070SDZbgF5xTGx9c=";
-
- buildPhase = ''
- export HOME=$TMPDIR
- export SSL_CERT_FILE="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
-
- # Pre‑populate registry so spago doesn't clone from GitHub
- mkdir -p $HOME/.cache/spago-nodejs
- cp -r ${spagoRegistry} $HOME/.cache/spago-nodejs/registry
- cp -r ${spagoRegistryIndex} $HOME/.cache/spago-nodejs/registry-index
- chmod -R u+w $HOME/.cache/spago-nodejs
-
- npm ci --ignore-scripts
- patchShebangs node_modules
- mkdir -p node_modules/.bin
- ln -sf ${pkgs.purescript}/bin/purs node_modules/.bin/purs
- npx spago install
- '';
-
- installPhase = ''
- mkdir -p $out
- cp -r .spago/p $out/packages
- '';
- };
-
- src = pkgs.lib.cleanSourceWith {
- src = self;
- filter = name: type: let
- baseName = baseNameOf (toString name);
- in
- !((type == "directory" && (baseName == "docs" || baseName == ".git"))
- || (type
- == "regular"
- && (
- pkgs.lib.hasSuffix ".md" baseName
- || baseName == "justfile"
- || baseName == "flake.nix"
- || baseName == "flake.lock"
- )));
- };
-
- corpus = pkgs.buildNpmPackage {
- pname = "corpus";
- inherit ((builtins.fromJSON (builtins.readFile ./package.json))) version;
- inherit src;
-
- npmDepsHash = "sha256-mWtapB6mIfm7+ZQC4YiZUj2zBqKpiKvPMnuI8AE9hE0=";
- npmRebuildFlags = ["--ignore-scripts"];
-
- nativeBuildInputs = with pkgs; [
- makeWrapper
- nodejs
- git
- purescript
- elmPackages.elm
- ];
-
- buildPhase = ''
- export HOME="$TMPDIR"
-
- # DuckDB bindings
- mkdir -p node_modules/duckdb/lib/binding
- tar -xf ${duckdbPrebuilt} -C node_modules/duckdb/lib/binding --strip-components=1
-
- # Spago packages
- mkdir -p .spago
- cp -r ${spagoDeps}/packages .spago/p
- chmod -R u+w .spago
-
- # Spago registry cache
- mkdir -p $HOME/.cache/spago-nodejs
- cp -r ${spagoRegistry} $HOME/.cache/spago-nodejs/registry
- cp -r ${spagoRegistryIndex} $HOME/.cache/spago-nodejs/registry-index
- chmod -R u+w $HOME/.cache/spago-nodejs
-
- # Elm packages
- mkdir -p $HOME/.elm/0.19.1
- cp -r ${elmDeps}/packages $HOME/.elm/0.19.1/
- chmod -R u+w $HOME/.elm
-
- npm run release
- '';
-
- installPhase = ''
- mkdir -p $out/lib/corpus
- cp -r server.js client.js users.json package.json node_modules assets $out/lib/corpus/
- if [ -f .env ]; then
- cp .env $out/lib/corpus/
- else
- cp .env.example $out/lib/corpus/.env
- fi
-
- mkdir -p $out/bin
- makeWrapper ${pkgs.nodejs}/bin/node $out/bin/corpus-server \
- --add-flags "--no-deprecation" \
- --add-flags "$out/lib/corpus/server.js" \
- --chdir "$out/lib/corpus"
- '';
- };
- in {
- packages = {
- default = corpus;
- inherit elmDeps spagoDeps;
- };
- });
+ corpus = pkgs.buildNpmPackage {
+ pname = "corpus";
+ inherit ((builtins.fromJSON (builtins.readFile ./package.json))) version;
+ inherit src;
+
+ npmDepsHash = "sha256-mWtapB6mIfm7+ZQC4YiZUj2zBqKpiKvPMnuI8AE9hE0=";
+ npmRebuildFlags = ["--ignore-scripts"];
+
+ nativeBuildInputs = with pkgs; [
+ makeWrapper
+ nodejs
+ git
+ purescript
+ elmPackages.elm
+ ];
+
+ buildPhase = ''
+ export HOME="$TMPDIR"
+
+ mkdir -p node_modules/duckdb/lib/binding
+ tar -xf ${duckdbPrebuilt} -C node_modules/duckdb/lib/binding --strip-components=1
+
+ mkdir -p .spago
+ cp -r ${spagoDeps}/packages .spago/p
+ chmod -R u+w .spago
+
+ mkdir -p $HOME/.cache/spago-nodejs
+ cp -r ${spagoRegistry} $HOME/.cache/spago-nodejs/registry
+ cp -r ${spagoRegistryIndex} $HOME/.cache/spago-nodejs/registry-index
+ chmod -R u+w $HOME/.cache/spago-nodejs
+
+ eval ${elmHomeScript}
+ npm run release
+ '';
+
+ installPhase = ''
+ mkdir -p $out/lib/corpus
+ cp -r server.js client.js users.json package.json node_modules assets $out/lib/corpus/
+ if [ -f .env ]; then
+ cp .env $out/lib/corpus/
+ else
+ cp .env.example $out/lib/corpus/.env
+ fi
+
+ mkdir -p $out/bin
+ makeWrapper ${pkgs.nodejs}/bin/node $out/bin/corpus-server \
+ --add-flags "--no-deprecation" \
+ --add-flags "$out/lib/corpus/server.js" \
+ --chdir "$out/lib/corpus"
+ '';
+ };
+ in {
+ devShells.default = pkgs.mkShell {
+ name = "corpus";
+ packages = [
+ elm2nix.packages.${system}.default
+ pkgs.nodejs
+ pkgs.purescript
+ pkgs.elmPackages.elm
+ pkgs.elmPackages.elm-format
+ pkgs.elmPackages.elm-json
+ ];
+ };
+
+ packages = {
+ default = corpus;
+ inherit spagoDeps;
+ };
+ }
+ );
}