corpus

self-hosted listenbrainz and last.fm proxy
Log | Files | Refs | README | LICENSE

flake.nix (5634B)


      1 {
      2   inputs = {
      3     nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
      4     elm2nix.url = "github:mtmn/elm2nix";
      5   };
      6 
      7   outputs = {
      8     self,
      9     nixpkgs,
     10     elm2nix,
     11   }: let
     12     system = "x86_64-linux";
     13     pkgs = nixpkgs.legacyPackages.${system};
     14 
     15     inherit
     16       (elm2nix.lib.elm2nix pkgs)
     17       generateRegistryDat
     18       prepareElmHomeScript
     19       ;
     20 
     21     duckdbPrebuilt = pkgs.fetchurl {
     22       url = "https://registry.npmjs.org/@duckdb/node-bindings-linux-x64/-/node-bindings-linux-x64-1.5.2-r.1.tgz";
     23       hash = "sha256-IMn1URw5Cn5hN801LmHoI/XgGrezlkcF+5ItJNeclvg=";
     24     };
     25 
     26     spagoRegistry = pkgs.fetchFromGitHub {
     27       owner = "purescript";
     28       repo = "registry";
     29       rev = "7c020ee4076070dfc917ed0efa6129ce1b60c0a8";
     30       hash = "sha256-5fxgKomfEI0SqLC/b55H5mLitLbXGh1syEWzuupwK7Y=";
     31     };
     32 
     33     spagoRegistryIndex = pkgs.fetchFromGitHub {
     34       owner = "purescript";
     35       repo = "registry-index";
     36       rev = "0f05445d856c828ef029fd9a982e119038778eda";
     37       hash = "sha256-cwp/L0YgKtbwyL0JhUsR8VTubmGxoaYgjHEwmI4Cypo=";
     38     };
     39 
     40     registryDat = generateRegistryDat {elmLock = ./elm.lock;};
     41 
     42     elmHomeScript = prepareElmHomeScript {
     43       elmLock = ./elm.lock;
     44       inherit registryDat;
     45     };
     46 
     47     pnpmDeps = pkgs.fetchPnpmDeps {
     48       src = pkgs.lib.cleanSourceWith {
     49         src = self;
     50         filter = name: _type: let
     51           baseName = baseNameOf (toString name);
     52         in
     53           pkgs.lib.elem baseName [
     54             "package.json"
     55             "pnpm-lock.yaml"
     56             "pnpm-workspace.yaml"
     57           ];
     58         name = "corpus-pnpm-source";
     59       };
     60       pname = "corpus";
     61       hash = "sha256-ghIjDWkrNTy3xegpHuCaIQur+EhObd1Y5ml6XgIXlKQ=";
     62       fetcherVersion = 3;
     63     };
     64 
     65     spagoDeps = pkgs.stdenv.mkDerivation {
     66       name = "corpus-spago-deps";
     67       outputHashAlgo = "sha256";
     68       outputHashMode = "recursive";
     69       outputHash = "sha256-sdor+SLxjw/e+OQeBiEyKyWeBLVaGo2tcAxf06vxth8=";
     70 
     71       src = pkgs.lib.cleanSourceWith {
     72         src = self;
     73         filter = name: _type: let
     74           baseName = baseNameOf (toString name);
     75         in
     76           pkgs.lib.elem baseName [
     77             "package.json"
     78             "pnpm-lock.yaml"
     79             "pnpm-workspace.yaml"
     80             "spago.yaml"
     81             "spago.lock"
     82           ];
     83       };
     84 
     85       nativeBuildInputs = with pkgs; [nodejs git cacert pnpm];
     86 
     87       buildPhase = ''
     88         export HOME=$TMPDIR
     89         export SSL_CERT_FILE="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
     90         export NODE_EXTRA_CA_CERTS="${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"
     91 
     92         mkdir -p $HOME/.cache/spago-nodejs
     93         cp -r ${spagoRegistry} $HOME/.cache/spago-nodejs/registry
     94         cp -r ${spagoRegistryIndex} $HOME/.cache/spago-nodejs/registry-index
     95         chmod -R u+w $HOME/.cache/spago-nodejs
     96 
     97         pnpm install --frozen-lockfile
     98         patchShebangs node_modules
     99         mkdir -p node_modules/.bin
    100         pnpm spago install
    101       '';
    102 
    103       installPhase = ''
    104         mkdir -p $out
    105         cp -r .spago/p $out/packages
    106       '';
    107     };
    108 
    109     src = pkgs.lib.cleanSourceWith {
    110       src = self;
    111       filter = name: _type: let
    112         relPath =
    113           pkgs.lib.removePrefix (toString self + "/") (toString name);
    114         topDir = builtins.head (pkgs.lib.splitString "/" relPath);
    115       in
    116         pkgs.lib.elem topDir [
    117           "package.json"
    118           "pnpm-lock.yaml"
    119           "pnpm-workspace.yaml"
    120           "elm.json"
    121           "spago.yaml"
    122           "spago.lock"
    123           "server.js"
    124           "client.js"
    125           "assets"
    126           "users.json"
    127           "src"
    128         ];
    129     };
    130 
    131     corpus = pkgs.stdenv.mkDerivation {
    132       pname = "corpus";
    133       inherit (builtins.fromJSON (builtins.readFile ./package.json)) version;
    134       inherit src;
    135 
    136       inherit pnpmDeps;
    137 
    138       nativeBuildInputs = with pkgs; [
    139         makeWrapper
    140         nodejs
    141         git
    142         elmPackages.elm
    143         purescript
    144         pnpm
    145         pnpmConfigHook
    146       ];
    147 
    148       buildPhase = ''
    149         mkdir -p node_modules/@duckdb/node-bindings-linux-x64
    150         tar -xf ${duckdbPrebuilt} -C node_modules/@duckdb/node-bindings-linux-x64 --strip-components=1
    151 
    152         ln -sf ${pkgs.purescript}/bin/purs node_modules/.bin/purs
    153 
    154         mkdir -p .spago
    155         cp -r ${spagoDeps}/packages .spago/p
    156         chmod -R u+w .spago
    157 
    158         mkdir -p $HOME/.cache/spago-nodejs
    159         cp -r ${spagoRegistry} $HOME/.cache/spago-nodejs/registry
    160         cp -r ${spagoRegistryIndex} $HOME/.cache/spago-nodejs/registry-index
    161         chmod -R u+w $HOME/.cache/spago-nodejs
    162 
    163         eval ${elmHomeScript}
    164         pnpm run release
    165       '';
    166 
    167       installPhase = ''
    168         mkdir -p $out/lib/corpus
    169         cp -r server.js client.js users.json package.json node_modules assets $out/lib/corpus/
    170         mkdir -p $out/bin
    171         makeWrapper ${pkgs.nodejs}/bin/node $out/bin/corpus-server \
    172           --add-flags "--no-deprecation" \
    173           --add-flags "$out/lib/corpus/server.js" \
    174           --chdir "$out/lib/corpus"
    175       '';
    176     };
    177     dockerImage = pkgs.dockerTools.buildLayeredImage {
    178       name = "corpus";
    179       tag = corpus.version;
    180       contents = [corpus];
    181       extraCommands = "mkdir -p tmp";
    182       config.Cmd = ["${corpus}/bin/corpus-server"];
    183     };
    184   in {
    185     devShells.${system}.default = pkgs.mkShell {
    186       name = "corpus";
    187       packages = [
    188         elm2nix.packages.${system}.default
    189         pkgs.nodejs
    190         pkgs.elmPackages.elm
    191         pkgs.elmPackages.elm-format
    192         pkgs.elmPackages.elm-json
    193         pkgs.pnpm
    194       ];
    195     };
    196 
    197     packages.${system} = {
    198       default = corpus;
    199       container = dockerImage;
    200     };
    201   };
    202 }