git.iko.soy/purestack-dev/spago-nix
on master help sign in
65 lines 2.3 kB history raw
1{
2 inputs = {
3 registry = {
4 url = "github:purescript/registry";
5 flake = false;
6 };
7 package-sets = {
8 url = "github:purescript/package-sets";
9 flake = false;
10 };
11 };
12 outputs = { self, registry, package-sets }: {
13 lib.spago = { pkgs, spago ? pkgs.spago, purs ? pkgs.purs }:
14 { src, main ? "Main" }:
15 let
16 projectSource = pkgs.runCommand "projectSource" { } ''
17 mkdir -p $out
18 ln -s ${src}/spago.dhall $out/spago.dhall
19 ln -s ${package-sets}/src/packages.dhall $out/packages.dhall
20 '';
21 project = pkgs.dhallToNix "${projectSource}/spago.dhall";
22 transitiveDependencies = builtins.genericClosure {
23 startSet = builtins.map (dep: {
24 key = dep;
25 val = project.packages.${dep};
26 }) project.dependencies;
27 operator = { val, ... }:
28 builtins.map (dep: {
29 key = dep;
30 val = project.packages.${dep};
31 }) val.dependencies;
32 };
33 deps = builtins.map (dep:
34 let
35 meta = builtins.fromJSON
36 (builtins.readFile "${registry}/metadata/${dep.key}.json");
37 v = pkgs.lib.strings.removePrefix "v" dep.val.version;
38 in pkgs.stdenv.mkDerivation {
39 pname = dep.key;
40 version = v;
41 src = pkgs.fetchurl {
42 url =
43 "https://packages.registry.purescript.org/${dep.key}/${v}.tar.gz";
44 hash = meta.published.${v}.hash;
45 };
46 installPhase = ''
47 cp -r . $out
48 '';
49 }) transitiveDependencies;
50 output = pkgs.runCommand "output" { buildInputs = [ purs ]; } ''
51 purs compile "${src}/**/*.purs" ${
52 builtins.toString
53 (builtins.map (dep: ''"${dep}/src/**/*.purs"'') deps)
54 } -o $out
55 '';
56 in pkgs.runCommand "${main}.js" {
57 buildInputs = [ spago purs pkgs.git pkgs.esbuild ];
58 } ''
59 ln -s ${projectSource}/packages.dhall packages.dhall
60 ln -s ${projectSource}/spago.dhall spago.dhall
61 ln -s ${output} output
62 spago --global-cache skip bundle-app --no-install --no-build --minify --main ${main} --to $out
63 '';
64 };