{ stdenv, fetchFromGitHub, callPackage, runCommand , bash, yarn , production ? false }: let target = if production then "prod" else "dev"; pkgInfo = stdenv.lib.importJSON ./package.json; src = ./.; yarn2nixSrc = fetchFromGitHub { owner = "Profpatsch"; repo = "yarn2nix"; rev = "3e3bc88398ef73f964c4dfe238fa80e65bf7fbc6"; sha256 = "142h572gwfg8d2pkbwm5s0cmxvw8ny8kc80vl0wrw45p6x335bgf"; }; yarn2nix = import yarn2nixSrc { }; yarn2nix-lib = callPackage (yarn2nixSrc + /nix-lib) { inherit yarn2nix; }; depsNix = runCommand "deps.nix" { } '' ${yarn2nix}/bin/yarn2nix ${src}/yarn.lock > $out ''; template = runCommand "template.nix" { } '' ${yarn2nix}/bin/yarn2nix --template ${src}/package.json > $out ''; node_modules = yarn2nix-lib.linkNodeDeps { inherit (pkgInfo) name; dependencies = (yarn2nix-lib.callTemplate template (yarn2nix-lib.buildNodeDeps (callPackage depsNix { }))).nodeBuildInputs; }; in stdenv.mkDerivation rec { pname = pkgInfo.name; inherit (pkgInfo) version; inherit src; buildInputs = [ yarn ]; phases = [ "unpackPhase" "patchPhase" "buildPhase" "installPhase" ]; postPatch = '' substituteInPlace ./package.json \ --replace node_modules "${node_modules}" ''; buildPhase = '' # temporary $HOME for yarn config export HOME=$(pwd)/yarn_home mkdir -p $HOME yarn config --offline set script-shell "${bash}/bin/bash" # binaries of deps.nix export PATH="${node_modules}/.bin:$PATH" # browserify won't look in NODE_PATH for modules ln -s ${node_modules} node_modules yarn run --offline build:assets yarn run --offline build:${target} ''; installPhase = '' mkdir -p $out/share/ cp -R dist $out/share/${pname} ''; }