corpus

Log | Files | Refs | README | LICENSE

commit ea29c4d0f0037d49b5534d2ec0782d1c156687be
parent b454ffafebae3f52dd7f549dab0e878a2fc94748
Author: mtmn <miro@haravara.org>
Date:   Sat,  2 May 2026 00:28:01 +0200

feat(nix): integrate elm2nix

Diffstat:
Aelm.lock | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mflake.lock | 76+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Mflake.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; + }; + } + ); }