{ pkgs, lib, buildPackages, buildNpmPackage, fetchFromGitHub, stdenv, writeShellScriptBin, writeText, symlinkJoin, callPackage, bundlerEnv, ruby_3_2, esbuild, }: let gemfile-patch = callPackage ./gemfile-patch.nix {}; src = callPackage ./source.nix { patches = [ gemfile-patch ./creds.patch ./esbuild-linux-64.patch ]; }; gems = bundlerEnv { name = "loomio-env"; ruby = ruby_3_2; gemset = ./. + "/gemset.nix"; gemdir = src; }; vue = buildNpmPackage { name = "loomio-vue"; src = "${src}"; npmRoot = "vue"; npmDepsHash = "sha256-DtzB1XIbdhJkLV88h1caKQeWfErwWBBf4OiQuKM/oQc="; buildPhase = '' runHook preBuild if [ -n "''${npmRoot-}" ]; then pushd "$npmRoot" fi npm run build if [ -n "''${npmRoot-}" ]; then popd fi runHook postBuild ''; dontNpmInstall = true; installPhase = '' mkdir $out cp -r * $out ''; }; databaseConfig = writeText "database.yml" '' production: adapter: postgresql database: <%= ENV['LOOMIO_DATABASE'] %> host: /var/run/postgresql ''; in stdenv.mkDerivation { name = "loomio"; src = vue; nativeBuildInputs = [ gems gems.wrappedRuby ]; buildInputs = [gems ruby_3_2]; buildPhase = '' runHook preBuild cp ${databaseConfig} config/database.yml cp ${./puma.rb} config/puma.rb # ln -s ''${vueNodeModules} vue/node_modules # ln -s ''${vue} vue-built export BUNDLE_FORCE_RUBY_PLATFORM=true ${gems}/bin/bundle exec bootsnap precompile --gemfile app/ lib/ patchShebangs bin/ for b in $(ls ${gems}/bin/) do if [ ! -f bin/$b ]; then ln -s ${gems}/bin/$b bin/$b fi done runHook postBuild ''; installPhase = '' mkdir -p $out cp -r * $out ''; }