elm2nix

Turn your Elm project into buildable Nix project

https://github.com/domenkozar/elm2nix#readme

Version on this page:0.3.1
LTS Haskell 23.1:0.4.0
Stackage Nightly 2024-12-26:0.4.0
Latest on Hackage:0.4.0

See all snapshots elm2nix appears in

BSD-3-Clause licensed by Domen Kozar
Maintained by [email protected]
This version can be pinned in stack with:elm2nix-0.3.1@sha256:4096a5820e3da2f69741afacf5f1edb2265b05cece018a86d7436463244a08d0,1882

Module documentation for 0.3.1

elm2nix

Build Status Hackage

Convert an Elm project into Nix expressions.

It consists of multiple commands:

  • elm2nix convert: Given elm.json in current directory, all dependencies are parsed and their sha256sum calculated
  • elm2nix snapshot: Downloads snapshot of https://package.elm-lang.org/all-packages json and converts into binary registry.dat used by elm-compiler as a cache
  • elm2nix init: Generates default.nix that glues everything together

Assumptions

Supports Elm 0.19.1

Installation

From nixpkgs (recommended)

Make sure you have up to date stable or unstable nixpkgs channel.

$ nix-env -i elm2nix

From source

$ git clone https://github.com/domenkozar/elm2nix.git
$ cd elm2nix
$ nix-env -if .

Usage

$ git clone https://github.com/evancz/elm-todomvc.git
$ cd elm-todomvc
$ elm2nix init > default.nix
$ elm2nix convert > elm-srcs.nix
# generates ./registry.dat
$ elm2nix snapshot
$ nix-build
$ chromium ./result/Main.html

Running tests (as per CI)

$ ./scripts/tests.sh

FAQ

Why is mkDerivation inlined into default.nix?

As it’s considered experimental, it’s generated for now. Might change in the future.

How do I use elm2nix with ParcelJS and Yarn?

Instead of running elm2nix init, create a default.nix with the following derivation:

{ pkgs ? import <nixpkgs> {}
}:

let
  yarnPkg = pkgs.mkYarnPackage {
    name = "myproject-node-packages";
    src = pkgs.lib.cleanSourceWith {
      src = ./.;
      name = "myproject-node-packages.json";
      filter = name: type: baseNameOf (toString name) == "package.json";
    };
    yarnLock = ./yarn.lock;
    publishBinsFor = ["parcel"];
  };
in pkgs.stdenv.mkDerivation {
  name = "myproject-frontend";
  src = pkgs.lib.cleanSource ./.;

  buildInputs = with pkgs.elmPackages; [
    elm
    elm-format
    yarnPkg
    pkgs.yarn
  ];

  patchPhase = ''
    rm -rf elm-stuff
    ln -sf ${yarnPkg}/node_modules .
  '';

  shellHook = ''
    ln -fs ${yarnPkg}/node_modules .
  '';

  configurePhase = pkgs.elmPackages.fetchElmDeps {
    elmPackages = import ./elm-srcs.nix;
    elmVersion = "0.19.1";
    registryDat = ./registry.dat;
  };

  installPhase = ''
    mkdir -p $out
    parcel build --dist-dir $out index.html
  '';
}

Changes

Changelog for elm2nix

0.3.0 (2022-09-06)

  • Prevent duplicates between src and test dependencies (@gpampara)
  • #48 Aeson 2 support (@gpampara)

0.2.1 (2020-11-22)

  • #40 Fix compatibility with newer versions of uglify.js (@turboMaCk)
  • #39 Switch to unversioned collection nodePackages for npm dependencies in default.nix (@ShrykeWindgrace)

0.2 (2019-12-28)

  • #35 Elm 0.19.1 support (@gpampara)

0.1.2 (2019-10-29)

  • #33 Minification of JS output (@turboMaCk)
  • #32 Make it possible to target JS output (@turboMaCk)
  • #31 Fetch test-dependencies (@prasmussen)

0.1.1 (2019-02-19)

Changes

  • #22 Support req-0.1.0.0 (@domenkozar)

0.1.0 (2018-12-28)

  • Initial release (@domenkozar)