Newer
Older
percord / flake.nix
{
  description = "Spacebar server, written in Typescript.";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachSystem flake-utils.lib.allSystems (system:
      let
        pkgs = import nixpkgs {
          inherit system;
        };
        hashesFile = builtins.fromJSON (builtins.readFile ./hashes.json);
        lib = pkgs.lib;
      in rec {
        packages.default = pkgs.buildNpmPackage {
          pname = "spacebar-server-ts";
          name = "spacebar-server-ts";

          meta = with lib; {
            description = "Spacebar server, a FOSS reimplementation of the Discord backend.";
            homepage = "https://github.com/spacebarchat/server";
            license = licenses.agpl3Plus;
            platforms = platforms.all;
            mainProgram = "start-bundle";
          };

          src = ./.;
          nativeBuildInputs = with pkgs; [ python3 ];
          npmDepsHash = hashesFile.npmDepsHash;
          makeCacheWritable = true;
          postPatch = ''
            substituteInPlace package.json --replace 'npx patch-package' '${pkgs.nodePackages.patch-package}/bin/patch-package'
          '';
          installPhase = ''
            runHook preInstall
            set -x
            #remove packages not needed for production, or at least try to...
            npm prune --omit dev --no-save $npmInstallFlags "''${npmInstallFlagsArray[@]}" $npmFlags "''${npmFlagsArray[@]}"
            find node_modules -maxdepth 1 -type d -empty -delete

            mkdir -p $out/node_modules/
            cp -r node_modules/* $out/node_modules/
            cp -r dist/ $out/node_modules/@spacebar
            for i in dist/**/start.js
            do
              makeWrapper ${pkgs.nodejs-slim}/bin/node $out/bin/start-`dirname ''${i/dist\//}` --prefix NODE_PATH : $out/node_modules --add-flags $out/node_modules/@spacebar`dirname ''${i/dist/}`/start.js
            done
            set +x
            substituteInPlace package.json --replace 'dist/' 'node_modules/@spacebar/'
            find $out/node_modules/@spacebar/ -type f -name "*.js" | while read srcFile; do
              echo Patching imports in ''${srcFile/$out\/node_modules\/@spacebar//}...
              substituteInPlace $srcFile --replace 'require("./' 'require(__dirname + "/'
              substituteInPlace $srcFile --replace 'require("../' 'require(__dirname + "/../'
              substituteInPlace $srcFile --replace ', "assets"' ', "..", "assets"'
              #substituteInPlace $srcFile --replace 'require("@spacebar/' 'require("
            done
            set -x
            cp -r assets/ $out/
            cp package.json $out/
            rm -v $out/assets/openapi.json
            #rm -v $out/assets/schemas.json

            #debug utils:
            #cp $out/node_modules/@spacebar/ $out/build_output -r
            set +x
            runHook postInstall
          '';
        };
        devShell = pkgs.mkShell {
          buildInputs = with pkgs; [
            nodejs
            nodePackages.typescript
          ];
        };
      }
    );
}