{ buildNpmPackage , fetchFromGitHub , importNpmLock , lib , openssl , php82 , nodejs_22 , symlinkJoin , writers , dataDir ? "/var/lib/invoiceninja" , runtimeDir ? "/run/invoiceninja" }: let pname = "invoiceninja"; version = "5.13.19"; uiVersion = "03.05.2026.1"; src = fetchFromGitHub { owner = pname; repo = pname; rev = "v${version}"; hash = "sha256-PlFu9MQ4nZ2oHgSwOLffqERpZPIWkpgZ/qTqru63a9Y="; }; uiSrc = fetchFromGitHub { owner = pname; repo = "ui"; tag = uiVersion; hash = "sha256-aEqYX/YNUV5UR631X4zQyqoXSSuUqvILplV8Mm557Bc="; }; # PHP composer composer = php82.buildComposerProject (finalAttrs: { inherit src version; pname = "${pname}-composer"; vendorHash = "sha256-2CyWKlyCyoCt/WdY7Ta0oEXW2KIkGwhilHtzpBJ5Wnk="; # Upstream composer.json has invalid license, webpatser/laravel-countries package is pointing # to commit-ref, and php required in require and require-dev composerStrictValidation = false; postInstall = ''mv "$out/share/php/${finalAttrs.pname}"/* $out''; }); # React frontend ui = buildNpmPackage { pname = "${pname}-ui"; version = uiVersion; src = uiSrc; nodejs = nodejs_22; #npmDepsHash = "sha256-T2/0POKcr4x98cy3rfeNyTIBZrHuLfqpC1J6nymGcys="; #npmPackFlags = [ "--ignore-scripts" ]; #npmInstallFlags = [ "--omit=dev" ]; npmConfigHook = importNpmLock.npmConfigHook; #npmDeps = importNpmLock { # package = builtins.readFile ./. + "/package.json"; # packageLock = builtins.readFile ./. + "/package-lock.json"; #}; npmDeps = importNpmLock { npmRoot = ./.; }; prePatch = '' sed -i 's/VITE_IS_TEST=true/VITE_IS_TEST=false/' .env.example cp .env.example .env # This will make the build output a single bundle file (bundle.[hash].js) cp ${composer}/vite.config.ts.react ./vite.config.js #${npm-lockfile-fix}/bin/npm-lockfile-fix ./package-lock.json ''; }; invoiceNinja = symlinkJoin { name = "invoiceninja"; paths = [ composer ui ]; }; in ui