{ description = "cardgen"; inputs = { flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; package = builtins.fromJSON (builtins.readFile ./package.json); in rec { packages = flake-utils.lib.flattenTree rec { cardgen = pkgs.buildNpmPackage rec { pname = "cardgen"; inherit (package) version; npmDepsHash = "sha256-1gQydlNbMBwCWj8++d79aBy5QaIIwiLMpsdurRz8FDA="; doCheck = false; nativeBuildInputs = with pkgs; [ makeWrapper ]; dontNpmBuild = true; installPhase = '' mkdir -p $out mv ./* $out/ makeWrapper ${pkgs.nodejs-slim}/bin/node $out/bin/cardgen \ --add-flags $out/index.js \ --chdir $out/ ''; src = ./.; }; }; defaultPackage = packages.cardgen; }) // { nixosModules = { cardgen = { config, lib, pkgs, ... }: with lib; let cfg = config.services.cardgen; in { options.services.cardgen = { enable = mkEnableOption "Enables the cardgen server"; port = mkOption { type = types.port; default = 3500; }; package = mkOption { type = types.package; default = self.defaultPackage.${pkgs.system}; }; }; config = mkIf cfg.enable { systemd.services."cardgen" = { wantedBy = [ "multi-user.target" ]; environment = { PORT = toString cfg.port; }; serviceConfig = { Restart = "on-failure"; ExecStart = "${getExe cfg.package}"; DynamicUser = "yes"; StateDirectory = "cardgen"; StateDirectoryMode = "0755"; }; }; }; }; }; }; }