purs-tidy: spago2nix → node2nix, 0.4.6 → 0.5.1 It seems bundling was added this week so this is golden now. It is simpler, that’s for sure.
5 files changed, 632 insertions(+), 987 deletions(-) M default.nix M purs-tidy/default.nix A purs-tidy/node-env.nix A purs-tidy/node-packages.nix D purs-tidy/spago-packages.nix
M default.nix => default.nix +1 -1
@@ 89,7 89,7 @@ let }; purs-tidy = import ./purs-tidy { inherit pkgs purs; inherit pkgs; }; psa = import ./psa {
M purs-tidy/default.nix => purs-tidy/default.nix +13 -52
@@ 1,61 1,22 @@ { pkgs ? import <nixpkgs> { inherit system; } , system ? builtins.currentSystem # node: >=14 , nodejs ? pkgs.nodejs # purs: ~0.14 , purs ? (import ../default.nix { inherit pkgs; }).purs-0_14_4 , nodejs ? pkgs."nodejs-12_x" }: let # one should be able to regenarate using process substitution, but spago # issue #472 # ```fish # spago2nix generate 4 -- \ # --config (echo "https://raw.githubusercontent.com/natefaubion/purescript-tidy/v${version}/bin/spago.dhall" | psub) # ``` # but you can create a temp file with the echo’d URL for spago2nix and spago # to call spagoPkgs = import ./spago-packages.nix { inherit pkgs; }; in pkgs.stdenv.mkDerivation rec { pname = "purs-tidy"; version = "0.4.6"; version = "0.5.1"; src = pkgs.fetchFromGitHub { owner = "natefaubion"; repo = "purescript-tidy"; rev = "v${version}"; sha256 = "sha256-hTgVWX5nEb1WcYJ+GFwQQrDrYtBNXsk8iZsnAY4H3eQ="; nodeEnv = import ./node-env.nix { inherit (pkgs) stdenv lib python2 runCommand writeTextFile; inherit pkgs nodejs; libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null; }; buildInputs = [ nodejs ]; nativeBuildInputs = [ spagoPkgs.installSpagoStyle spagoPkgs.buildSpagoStyle spagoPkgs.buildFromNixStore purs ]; # this allows us to drop the package.json file all together patchPhase = '' substituteInPlace bin/Bin/Version.js \ --replace 'require("../../package.json").version' '"${version}"'; ''; unpackPhase = '' cp $src/{packages,spago}.dhall . cp -r $src/bin $src/src . install-spago-style ''; buildPhase = '' build-spago-style "./src/**/*.purs" "./bin/**/*.purs" ''; nodePackage = import ./node-packages.nix { inherit (pkgs) fetchurl nix-gitignore stdenv lib fetchgit; inherit nodeEnv; }; installPhase = '' mkdir -p $out/{bin,output} cp -r output/ $out cp $src/bin/index.js $out/bin/purs-tidy chmod u+x $out/bin/purs-tidy ''; } source = nodePackage.sources."purs-tidy-${version}".src; in nodeEnv.buildNodePackage (nodePackage.args // { src = source; })
A purs-tidy/node-env.nix => purs-tidy/node-env.nix +567 -0
@@ 0,0 1,567 @@ # This file originates from node2nix {lib, stdenv, nodejs, python2, pkgs, libtool, runCommand, writeTextFile}: let # Workaround to cope with utillinux in Nixpkgs 20.09 and util-linux in Nixpkgs master utillinux = if pkgs ? utillinux then pkgs.utillinux else pkgs.util-linux; python = if nodejs ? python then nodejs.python else python2; # Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise tarWrapper = runCommand "tarWrapper" {} '' mkdir -p $out/bin cat > $out/bin/tar <<EOF #! ${stdenv.shell} -e $(type -p tar) "\$@" --warning=no-unknown-keyword --delay-directory-restore EOF chmod +x $out/bin/tar ''; # Function that generates a TGZ file from a NPM project buildNodeSourceDist = { name, version, src, ... }: stdenv.mkDerivation { name = "node-tarball-${name}-${version}"; inherit src; buildInputs = [ nodejs ]; buildPhase = '' export HOME=$TMPDIR tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts) ''; installPhase = '' mkdir -p $out/tarballs mv $tgzFile $out/tarballs mkdir -p $out/nix-support echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products ''; }; includeDependencies = {dependencies}: lib.optionalString (dependencies != []) (lib.concatMapStrings (dependency: '' # Bundle the dependencies of the package mkdir -p node_modules cd node_modules # Only include dependencies if they don't exist. They may also be bundled in the package. if [ ! -e "${dependency.name}" ] then ${composePackage dependency} fi cd .. '' ) dependencies); # Recursively composes the dependencies of a package composePackage = { name, packageName, src, dependencies ? [], ... }@args: builtins.addErrorContext "while evaluating node package '${packageName}'" '' DIR=$(pwd) cd $TMPDIR unpackFile ${src} # Make the base dir in which the target dependency resides first mkdir -p "$(dirname "$DIR/${packageName}")" if [ -f "${src}" ] then # Figure out what directory has been unpacked packageDir="$(find . -maxdepth 1 -type d | tail -1)" # Restore write permissions to make building work find "$packageDir" -type d -exec chmod u+x {} \; chmod -R u+w "$packageDir" # Move the extracted tarball into the output folder mv "$packageDir" "$DIR/${packageName}" elif [ -d "${src}" ] then # Get a stripped name (without hash) of the source directory. # On old nixpkgs it's already set internally. if [ -z "$strippedName" ] then strippedName="$(stripHash ${src})" fi # Restore write permissions to make building work chmod -R u+w "$strippedName" # Move the extracted directory into the output folder mv "$strippedName" "$DIR/${packageName}" fi # Unset the stripped name to not confuse the next unpack step unset strippedName # Include the dependencies of the package cd "$DIR/${packageName}" ${includeDependencies { inherit dependencies; }} cd .. ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} ''; pinpointDependencies = {dependencies, production}: let pinpointDependenciesFromPackageJSON = writeTextFile { name = "pinpointDependencies.js"; text = '' var fs = require('fs'); var path = require('path'); function resolveDependencyVersion(location, name) { if(location == process.env['NIX_STORE']) { return null; } else { var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json"); if(fs.existsSync(dependencyPackageJSON)) { var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON)); if(dependencyPackageObj.name == name) { return dependencyPackageObj.version; } } else { return resolveDependencyVersion(path.resolve(location, ".."), name); } } } function replaceDependencies(dependencies) { if(typeof dependencies == "object" && dependencies !== null) { for(var dependency in dependencies) { var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency); if(resolvedVersion === null) { process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n"); } else { dependencies[dependency] = resolvedVersion; } } } } /* Read the package.json configuration */ var packageObj = JSON.parse(fs.readFileSync('./package.json')); /* Pinpoint all dependencies */ replaceDependencies(packageObj.dependencies); if(process.argv[2] == "development") { replaceDependencies(packageObj.devDependencies); } replaceDependencies(packageObj.optionalDependencies); /* Write the fixed package.json file */ fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2)); ''; }; in '' node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"} ${lib.optionalString (dependencies != []) '' if [ -d node_modules ] then cd node_modules ${lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies} cd .. fi ''} ''; # Recursively traverses all dependencies of a package and pinpoints all # dependencies in the package.json file to the versions that are actually # being used. pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args: '' if [ -d "${packageName}" ] then cd "${packageName}" ${pinpointDependencies { inherit dependencies production; }} cd .. ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} fi ''; # Extract the Node.js source code which is used to compile packages with # native bindings nodeSources = runCommand "node-sources" {} '' tar --no-same-owner --no-same-permissions -xf ${nodejs.src} mv node-* $out ''; # Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty) addIntegrityFieldsScript = writeTextFile { name = "addintegrityfields.js"; text = '' var fs = require('fs'); var path = require('path'); function augmentDependencies(baseDir, dependencies) { for(var dependencyName in dependencies) { var dependency = dependencies[dependencyName]; // Open package.json and augment metadata fields var packageJSONDir = path.join(baseDir, "node_modules", dependencyName); var packageJSONPath = path.join(packageJSONDir, "package.json"); if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored console.log("Adding metadata fields to: "+packageJSONPath); var packageObj = JSON.parse(fs.readFileSync(packageJSONPath)); if(dependency.integrity) { packageObj["_integrity"] = dependency.integrity; } else { packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads. } if(dependency.resolved) { packageObj["_resolved"] = dependency.resolved; // Adopt the resolved property if one has been provided } else { packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories. } if(dependency.from !== undefined) { // Adopt from property if one has been provided packageObj["_from"] = dependency.from; } fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2)); } // Augment transitive dependencies if(dependency.dependencies !== undefined) { augmentDependencies(packageJSONDir, dependency.dependencies); } } } if(fs.existsSync("./package-lock.json")) { var packageLock = JSON.parse(fs.readFileSync("./package-lock.json")); if(![1, 2].includes(packageLock.lockfileVersion)) { process.stderr.write("Sorry, I only understand lock file versions 1 and 2!\n"); process.exit(1); } if(packageLock.dependencies !== undefined) { augmentDependencies(".", packageLock.dependencies); } } ''; }; # Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes reconstructPackageLock = writeTextFile { name = "addintegrityfields.js"; text = '' var fs = require('fs'); var path = require('path'); var packageObj = JSON.parse(fs.readFileSync("package.json")); var lockObj = { name: packageObj.name, version: packageObj.version, lockfileVersion: 1, requires: true, dependencies: {} }; function augmentPackageJSON(filePath, dependencies) { var packageJSON = path.join(filePath, "package.json"); if(fs.existsSync(packageJSON)) { var packageObj = JSON.parse(fs.readFileSync(packageJSON)); dependencies[packageObj.name] = { version: packageObj.version, integrity: "sha1-000000000000000000000000000=", dependencies: {} }; processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies); } } function processDependencies(dir, dependencies) { if(fs.existsSync(dir)) { var files = fs.readdirSync(dir); files.forEach(function(entry) { var filePath = path.join(dir, entry); var stats = fs.statSync(filePath); if(stats.isDirectory()) { if(entry.substr(0, 1) == "@") { // When we encounter a namespace folder, augment all packages belonging to the scope var pkgFiles = fs.readdirSync(filePath); pkgFiles.forEach(function(entry) { if(stats.isDirectory()) { var pkgFilePath = path.join(filePath, entry); augmentPackageJSON(pkgFilePath, dependencies); } }); } else { augmentPackageJSON(filePath, dependencies); } } }); } } processDependencies("node_modules", lockObj.dependencies); fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2)); ''; }; prepareAndInvokeNPM = {packageName, bypassCache, reconstructLock, npmFlags, production}: let forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com"; in '' # Pinpoint the versions of all dependencies to the ones that are actually being used echo "pinpointing versions of dependencies..." source $pinpointDependenciesScriptPath # Patch the shebangs of the bundled modules to prevent them from # calling executables outside the Nix store as much as possible patchShebangs . # Deploy the Node.js package by running npm install. Since the # dependencies have been provided already by ourselves, it should not # attempt to install them again, which is good, because we want to make # it Nix's responsibility. If it needs to install any dependencies # anyway (e.g. because the dependency parameters are # incomplete/incorrect), it fails. # # The other responsibilities of NPM are kept -- version checks, build # steps, postprocessing etc. export HOME=$TMPDIR cd "${packageName}" runHook preRebuild ${lib.optionalString bypassCache '' ${lib.optionalString reconstructLock '' if [ -f package-lock.json ] then echo "WARNING: Reconstruct lock option enabled, but a lock file already exists!" echo "This will most likely result in version mismatches! We will remove the lock file and regenerate it!" rm package-lock.json else echo "No package-lock.json file found, reconstructing..." fi node ${reconstructPackageLock} ''} node ${addIntegrityFieldsScript} ''} npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild if [ "''${dontNpmInstall-}" != "1" ] then # NPM tries to download packages even when they already exist if npm-shrinkwrap is used. rm -f npm-shrinkwrap.json npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} install fi ''; # Builds and composes an NPM package including all its dependencies buildNodePackage = { name , packageName , version , dependencies ? [] , buildInputs ? [] , production ? true , npmFlags ? "" , dontNpmInstall ? false , bypassCache ? false , reconstructLock ? false , preRebuild ? "" , dontStrip ? true , unpackPhase ? "true" , buildPhase ? "true" , ... }@args: let extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" ]; in stdenv.mkDerivation ({ name = "node_${name}-${version}"; buildInputs = [ tarWrapper python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ lib.optional (stdenv.isDarwin) libtool ++ buildInputs; inherit nodejs; inherit dontStrip; # Stripping may fail a build for some package deployments inherit dontNpmInstall preRebuild unpackPhase buildPhase; compositionScript = composePackage args; pinpointDependenciesScript = pinpointDependenciesOfPackage args; passAsFile = [ "compositionScript" "pinpointDependenciesScript" ]; installPhase = '' # Create and enter a root node_modules/ folder mkdir -p $out/lib/node_modules cd $out/lib/node_modules # Compose the package and all its dependencies source $compositionScriptPath ${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }} # Create symlink to the deployed executable folder, if applicable if [ -d "$out/lib/node_modules/.bin" ] then ln -s $out/lib/node_modules/.bin $out/bin fi # Create symlinks to the deployed manual page folders, if applicable if [ -d "$out/lib/node_modules/${packageName}/man" ] then mkdir -p $out/share for dir in "$out/lib/node_modules/${packageName}/man/"* do mkdir -p $out/share/man/$(basename "$dir") for page in "$dir"/* do ln -s $page $out/share/man/$(basename "$dir") done done fi # Run post install hook, if provided runHook postInstall ''; } // extraArgs); # Builds a node environment (a node_modules folder and a set of binaries) buildNodeDependencies = { name , packageName , version , src , dependencies ? [] , buildInputs ? [] , production ? true , npmFlags ? "" , dontNpmInstall ? false , bypassCache ? false , reconstructLock ? false , dontStrip ? true , unpackPhase ? "true" , buildPhase ? "true" , ... }@args: let extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ]; in stdenv.mkDerivation ({ name = "node-dependencies-${name}-${version}"; buildInputs = [ tarWrapper python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ lib.optional (stdenv.isDarwin) libtool ++ buildInputs; inherit dontStrip; # Stripping may fail a build for some package deployments inherit dontNpmInstall unpackPhase buildPhase; includeScript = includeDependencies { inherit dependencies; }; pinpointDependenciesScript = pinpointDependenciesOfPackage args; passAsFile = [ "includeScript" "pinpointDependenciesScript" ]; installPhase = '' mkdir -p $out/${packageName} cd $out/${packageName} source $includeScriptPath # Create fake package.json to make the npm commands work properly cp ${src}/package.json . chmod 644 package.json ${lib.optionalString bypassCache '' if [ -f ${src}/package-lock.json ] then cp ${src}/package-lock.json . fi ''} # Go to the parent folder to make sure that all packages are pinpointed cd .. ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} ${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }} # Expose the executables that were installed cd .. ${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} mv ${packageName} lib ln -s $out/lib/node_modules/.bin $out/bin ''; } // extraArgs); # Builds a development shell buildNodeShell = { name , packageName , version , src , dependencies ? [] , buildInputs ? [] , production ? true , npmFlags ? "" , dontNpmInstall ? false , bypassCache ? false , reconstructLock ? false , dontStrip ? true , unpackPhase ? "true" , buildPhase ? "true" , ... }@args: let nodeDependencies = buildNodeDependencies args; in stdenv.mkDerivation { name = "node-shell-${name}-${version}"; buildInputs = [ python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ buildInputs; buildCommand = '' mkdir -p $out/bin cat > $out/bin/shell <<EOF #! ${stdenv.shell} -e $shellHook exec ${stdenv.shell} EOF chmod +x $out/bin/shell ''; # Provide the dependencies in a development shell through the NODE_PATH environment variable inherit nodeDependencies; shellHook = lib.optionalString (dependencies != []) '' export NODE_PATH=${nodeDependencies}/lib/node_modules export PATH="${nodeDependencies}/bin:$PATH" ''; }; in { buildNodeSourceDist = lib.makeOverridable buildNodeSourceDist; buildNodePackage = lib.makeOverridable buildNodePackage; buildNodeDependencies = lib.makeOverridable buildNodeDependencies; buildNodeShell = lib.makeOverridable buildNodeShell; }
A purs-tidy/node-packages.nix => purs-tidy/node-packages.nix +51 -0
@@ 0,0 1,51 @@ # This file has been generated by node2nix 1.9.0. Do not edit! {nodeEnv, fetchurl, fetchgit, nix-gitignore, stdenv, lib, globalBuildInputs ? []}: let sources = { "purs-tidy-0.5.1" = { name = "purs-tidy"; packageName = "purs-tidy"; version = "0.5.1"; src = fetchurl { url = "https://registry.npmjs.org/purs-tidy/-/purs-tidy-0.5.1.tgz"; sha512 = "f9d8uw5SbPJGGry+ZF5JbYiCl6ojTHzXdO0qY4qWdSXtJdlBgxnqHmxOntCG8olUsmLF0eK90kMTzOlf5KJuyA=="; }; }; }; args = { name = "purs-tidy"; packageName = "purs-tidy"; version = "0.5.1"; src = ./.; dependencies = [ sources."purs-tidy-0.5.1" ]; buildInputs = globalBuildInputs; meta = { }; production = true; bypassCache = true; reconstructLock = true; }; in { args = args; sources = sources; tarball = nodeEnv.buildNodeSourceDist args; package = nodeEnv.buildNodePackage args; shell = nodeEnv.buildNodeShell args; nodeDependencies = nodeEnv.buildNodeDependencies (lib.overrideExisting args { src = stdenv.mkDerivation { name = args.name + "-package-json"; src = nix-gitignore.gitignoreSourcePure [ "*" "!package.json" "!package-lock.json" ] args.src; dontBuild = true; installPhase = "mkdir -p $out; cp -r ./* $out;"; }; }); }
D purs-tidy/spago-packages.nix => purs-tidy/spago-packages.nix +0 -934
@@ 1,934 0,0 @@ # This file was generated by Spago2Nix { pkgs ? import <nixpkgs> {} }: let inputs = { "aff" = pkgs.stdenv.mkDerivation { name = "aff"; version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-aff.git"; rev = "d0eb009f2f47cb1f5ba1d8592d90c95e8e7ff75d"; sha256 = "1780sgqyvbdgh8ynxmxn5d44vvhaz7kn9sv3l44c2s9q8xfjkfgm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "ansi" = pkgs.stdenv.mkDerivation { name = "ansi"; version = "v6.1.0"; src = pkgs.fetchgit { url = "https://github.com/hdgarrood/purescript-ansi.git"; rev = "e89e6fede616bd16b001841cf30ac320c95313a6"; sha256 = "1jsll0h7nz13zgscs036cnkkc6frnlcnk6fwjdwsyp6wbmjri2zm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "argonaut-codecs" = pkgs.stdenv.mkDerivation { name = "argonaut-codecs"; version = "v8.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut-codecs.git"; rev = "b0a041d92bfd548e2cd793cc7c02363464325a13"; sha256 = "11vmlq98s4jmg5grvdrrlfkqj9vk3la44ky8158a440ipcpinjkq"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "argonaut-core" = pkgs.stdenv.mkDerivation { name = "argonaut-core"; version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-argonaut-core.git"; rev = "673971dee79667882a83f9fda7097e50530726f1"; sha256 = "13ka4xybc8ql54xlkkhy4919nnapfigdlk51ja85f8xwhr64x9kq"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "argparse-basic" = pkgs.stdenv.mkDerivation { name = "argparse-basic"; version = "v1.0.0"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-argparse-basic.git"; rev = "cad9bd94a84ccf50c53be2f21ab5941a0a9ffeb9"; sha256 = "0xai0rhhfsdhpp1grniphax5kwx4r631wlkr9dl7alpv6xa5g4w0"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "arraybuffer-types" = pkgs.stdenv.mkDerivation { name = "arraybuffer-types"; version = "v3.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-arraybuffer-types.git"; rev = "48cd7f4887791db1d9c2daf5fd98b62ba00e15bd"; sha256 = "09r6bhsiq9iqdsjf9p8m3p31qkszsipsafvy836mfdi8af6h5fv6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "arrays" = pkgs.stdenv.mkDerivation { name = "arrays"; version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-arrays.git"; rev = "c0aa3176b077ad7a46b11ef34487485c28142e53"; sha256 = "0lm0m5hapimchzgfywr648pkw1hpggr6qibh8d19p2impbnc94c0"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "avar" = pkgs.stdenv.mkDerivation { name = "avar"; version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-avar.git"; rev = "ac3cbbb8d4b71ff19a78a3178355c089e44d3b4d"; sha256 = "005046wl61w6r5v3qwd16srhcx82vdz3yvp4xzad2xaasb6iq55l"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "bifunctors" = pkgs.stdenv.mkDerivation { name = "bifunctors"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-bifunctors.git"; rev = "a31d0fc4bbebf19d5e9b21b65493c28b8d3fba62"; sha256 = "0xc2hf8ccdgqw3m9qcmr38kmzv05fsxvakd07wyrqshvkzg3xn0d"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "catenable-lists" = pkgs.stdenv.mkDerivation { name = "catenable-lists"; version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-catenable-lists.git"; rev = "ee03395f2c5d59a7fd8529a0faac6ec1ebcbb682"; sha256 = "1lz06fx0za5sl65wccn5fl37mw3x4jnvrriz1gg0aqsmm9lag7ss"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "console" = pkgs.stdenv.mkDerivation { name = "console"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-console.git"; rev = "d7cb69ef8fed8a51466afe1b623868bb29e8586e"; sha256 = "0fzzzqjgrz33pb2jf7cdqpg09ilxb7bsrc7sbfq52wjg0sx9aq6g"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "const" = pkgs.stdenv.mkDerivation { name = "const"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-const.git"; rev = "3a3a4bdc44f71311cf27de9bd22039b110277540"; sha256 = "0aq9qjbrvf8mf8hmas6imv4mg6n3zi13hkf449ns1hn12lw8qv4g"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "contravariant" = pkgs.stdenv.mkDerivation { name = "contravariant"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-contravariant.git"; rev = "ae1a765f7ddbfd96ae1f12e399e46d554d8e3b38"; sha256 = "029hb8i3n4759x4gc06wkfgr7wim5x1w5jy2bsiy42n0g731h5qc"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "control" = pkgs.stdenv.mkDerivation { name = "control"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-control.git"; rev = "18d582e311f1f8523f9eb55fb93c91bd21e22837"; sha256 = "06dc06yli4g5yr8fb9sdpqbhiaff37g977qcsbds9q2mlhnjgfx9"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "datetime" = pkgs.stdenv.mkDerivation { name = "datetime"; version = "v5.0.2"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-datetime.git"; rev = "e110462829ea656d2bc0924266d4edff222108d4"; sha256 = "1mhzn2ymdkzki7wjlr9xrdbngm0886wmfbh2c46flnf9lmfyw54y"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "distributive" = pkgs.stdenv.mkDerivation { name = "distributive"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-distributive.git"; rev = "11f3f87ca5720899e1739cedb58dd6227cae6ad5"; sha256 = "0788znmdyh6b1c9pln624ah397l88xmd3fxlxiy3z1qy8bzr4r54"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "dodo-printer" = pkgs.stdenv.mkDerivation { name = "dodo-printer"; version = "v2.1.0"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-dodo-printer.git"; rev = "540dba0442abe686c0b211868d6f423e5df81b69"; sha256 = "0d95dinb821vjmx891f3qaxsdnwrwzahglam11f8wrr6mcxsrqvw"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "effect" = pkgs.stdenv.mkDerivation { name = "effect"; version = "v3.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-effect.git"; rev = "985d97bd5721ddcc41304c55a7ca2bb0c0bfdc2a"; sha256 = "1n9qr85knvpm4i0qhm8xbgfk46v9y843p76j278phfs9l6aywzsn"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "either" = pkgs.stdenv.mkDerivation { name = "either"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-either.git"; rev = "c1a1af35684f10eecaf6ac7d38dbf6bd48af2ced"; sha256 = "18dk159yyv7vs0xsnh9m5fajd7zy6zw5b2mpyd6nqdh3c6bb9wh6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "enums" = pkgs.stdenv.mkDerivation { name = "enums"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-enums.git"; rev = "170d959644eb99e0025f4ab2e38f5f132fd85fa4"; sha256 = "1lci5iy6s6cmh93bpkfcmp0j4n5dnij7dswb0075bk0kzd9xp7rs"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "exceptions" = pkgs.stdenv.mkDerivation { name = "exceptions"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-exceptions.git"; rev = "410d0b8813592bda3c25028540eeb2cda312ddc9"; sha256 = "1yjbrx34a0rnxgpvywb63n9jzhkdgb2q2acyzbwh290mrrggc95x"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "exists" = pkgs.stdenv.mkDerivation { name = "exists"; version = "v5.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-exists.git"; rev = "c34820f8b2d15be29abdd5097c3d636f5df8f28c"; sha256 = "15qp52cpp2yvxihkzfmn6gabyvx5s6iz5lafvqhyfgp4wfnz0bds"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "foldable-traversable" = pkgs.stdenv.mkDerivation { name = "foldable-traversable"; version = "v5.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foldable-traversable.git"; rev = "d581caf260772b1b446c11ac3c8be807b290b220"; sha256 = "182na4np7hk2dqyxywy4jij2csrzx4bz02m6bq8yx1j27hlgjvsd"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "foreign" = pkgs.stdenv.mkDerivation { name = "foreign"; version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foreign.git"; rev = "7ee18c6689c56c89755172ea53326f948da10bd3"; sha256 = "16j7712cck79p8q53xbhn4hs886bm0ls5wvmchrhqnaghj48m85g"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "foreign-object" = pkgs.stdenv.mkDerivation { name = "foreign-object"; version = "v3.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-foreign-object.git"; rev = "c9a7b7bb8bed1b87c5545c4ebe85a70f86c0e6b1"; sha256 = "0accw6qd93qqry19rskjgl7y54xi2wd70rglbqyjx6c5ybcjnavr"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "free" = pkgs.stdenv.mkDerivation { name = "free"; version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-free.git"; rev = "06e76495397eafe15c9c1273f2ef05e55f1a3ca3"; sha256 = "0kpq83qjfjzf1l2f1cnnx36kjwnm5czgjyh2imwp3bna8js6sk39"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "functions" = pkgs.stdenv.mkDerivation { name = "functions"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-functions.git"; rev = "691b3345bc2feaf914e5299796c606b6a6bf9ca9"; sha256 = "1gnk6xh5x04zcahn82gwp49qpglxd5jkfqn0i58m27jfihvblaxd"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "functors" = pkgs.stdenv.mkDerivation { name = "functors"; version = "v4.1.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-functors.git"; rev = "e936f7a8d2ec53a344c478ccada5add93273848c"; sha256 = "0i1x14r54758s5jx5d7zy4l07mg6gabljadgybldnbpmdqk6b966"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "gen" = pkgs.stdenv.mkDerivation { name = "gen"; version = "v3.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-gen.git"; rev = "85c369f56545a3de834b7e7475a56bc9193bb4b4"; sha256 = "1h396rqn1fc2c155i58vnaksqjrpajly128ah6wq1w426vwr1vrf"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "identity" = pkgs.stdenv.mkDerivation { name = "identity"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-identity.git"; rev = "5c150ac5ee4fa6f145932f6322a1020463dae8e9"; sha256 = "0a58y71ihvb5b7plnn2sxsbphqzd9nzfafak4d5a576agn76q0ql"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "integers" = pkgs.stdenv.mkDerivation { name = "integers"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-integers.git"; rev = "8a783f2d92596c43afca53066ac18eb389d15981"; sha256 = "1rrygw0ai61brnvgap7dfhdzacyhg5439pz6yrmmyg32cvf0znhv"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "invariant" = pkgs.stdenv.mkDerivation { name = "invariant"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-invariant.git"; rev = "c421b49dec7a1511073bb408a08bdd8c9d17d7b1"; sha256 = "0vwkbh7kv00g50xjgvxc0mv5b99mrj6q0sxznxwk32hb9hkbhy5l"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "js-date" = pkgs.stdenv.mkDerivation { name = "js-date"; version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-js-date.git"; rev = "a6834eef986e3af0490cb672dc4a8b4b089dcb15"; sha256 = "1dpiwn65qww862ilpfbd06gwfazpxvz3jwvsjsdrcxqqfcbjp8n8"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "lazy" = pkgs.stdenv.mkDerivation { name = "lazy"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-lazy.git"; rev = "2f73f61e7ac1ae1cfe05564112e3313530e673ff"; sha256 = "1wxfx019911gbkifq266hgn67zwm89pxhi83bai77mva5n9j3f6l"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "lists" = pkgs.stdenv.mkDerivation { name = "lists"; version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-lists.git"; rev = "6383c4f202b3f69474f9f7da182c2d42fcc3111c"; sha256 = "0xmg918s3mqvfvwgjfqcs1yvcz6hy2n7h3ygqz2iyvk868gz25qs"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "math" = pkgs.stdenv.mkDerivation { name = "math"; version = "v3.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-math.git"; rev = "59746cc74e23fb1f04e09342884c5d1e3943a04f"; sha256 = "0hkf0vyiga21992d9vbvdbnzdkvgljmsi497jjas1rk3vhblx8sq"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "maybe" = pkgs.stdenv.mkDerivation { name = "maybe"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-maybe.git"; rev = "8e96ca0187208e78e8df6a464c281850e5c9400c"; sha256 = "0vyk3r9gklvv7awzpph7ra53zxxbin1ngmqflb5vvr2365v5xyqy"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "newtype" = pkgs.stdenv.mkDerivation { name = "newtype"; version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-newtype.git"; rev = "7b292fcd2ac7c4a25d7a7a8d3387d0ee7de89b13"; sha256 = "1fgzbxslckva2psn0sia30hfakx8xchz3wx2kkh3w8rr4nn2py8v"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "node-buffer" = pkgs.stdenv.mkDerivation { name = "node-buffer"; version = "v7.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-buffer.git"; rev = "0721f1e8d768df48ae429547c8c60b121ca120cb"; sha256 = "14bf3llsa20ivkwp5hlyk8v8zfzpzhhsni9pd8rfqdyzp6zrdx3b"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "node-fs" = pkgs.stdenv.mkDerivation { name = "node-fs"; version = "v6.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-fs.git"; rev = "09a2b71a3a86f0cd19c46f4b6c40310cc1648909"; sha256 = "1w97m2afn7yn757niknkbk7w6nyg4n5dabxr7gzfz368z1nkf45s"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "node-fs-aff" = pkgs.stdenv.mkDerivation { name = "node-fs-aff"; version = "v7.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-fs-aff.git"; rev = "1da5d326573c3b17c6d4dba3d0e0157e60869f91"; sha256 = "10aglq89gbchykwlckmg5xsln705qha76f125snkmk056kq2w89h"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "node-glob-basic" = pkgs.stdenv.mkDerivation { name = "node-glob-basic"; version = "v1.2.2"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-node-glob-basic.git"; rev = "d20f2866c3bb472c68848be5b153e28933c07a38"; sha256 = "1pfggiqjizh7p30wq9ap0jw08szqmvin1wbbxpf1272qdg4ihlyq"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "node-path" = pkgs.stdenv.mkDerivation { name = "node-path"; version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-path.git"; rev = "a2d7cf05e40b607ef7d048a3684cda788cd42890"; sha256 = "1384qyf4v84wbahafzvqdxjllqy8qkd5dpkhsl3js444vsm2aplr"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "node-process" = pkgs.stdenv.mkDerivation { name = "node-process"; version = "v8.2.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-process.git"; rev = "e1e807ac7831d1a8a15e242964f7e5005e42f76b"; sha256 = "0nl9r271s8f71a9wqfkadq9b490h8phwgqc61jbzhm4ags23pqpg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "node-streams" = pkgs.stdenv.mkDerivation { name = "node-streams"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-node-streams.git"; rev = "886bb2045685e3b9031687d69ccfed29972147bb"; sha256 = "1jc3d4x0v77h8qcwq7hpwprsdr3gqmdfiyr1ph0kiy7r9bbrqwfx"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "node-workerbees" = pkgs.stdenv.mkDerivation { name = "node-workerbees"; version = "v0.2.1"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-node-workerbees.git"; rev = "6b688b79920920fe0b3df418bf227f75f373c54e"; sha256 = "1vkx9y0fyqvqfbkgdrxphhja71g282p38yrnfh39jznf3141610j"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "nonempty" = pkgs.stdenv.mkDerivation { name = "nonempty"; version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-nonempty.git"; rev = "d3e91e3d6e06e5bdcc5b2c21c8e5d0f9b946bb9e"; sha256 = "0azk1jrpqnjf2i97lcp63wcm31c4hddklp1mfmdan27zap3zqyjm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "now" = pkgs.stdenv.mkDerivation { name = "now"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-now.git"; rev = "4c994dae8bb650787de1e4d9e709f2565fb354fb"; sha256 = "1wa4j2h5rlw1lgfpm7rif3v6ksm8lplxl1x69zpk8hdf0cfyz4qm"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "nullable" = pkgs.stdenv.mkDerivation { name = "nullable"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-contrib/purescript-nullable.git"; rev = "8b19c16b16593102ae5d5d9f5b42eea0e213e2f5"; sha256 = "0jbmks8kwhpb5fr2b9nb70fjwh6zdnwirycvzr77jafcny24yrnl"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "numbers" = pkgs.stdenv.mkDerivation { name = "numbers"; version = "v8.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-numbers.git"; rev = "f5bbd96cbed58403c4445bd4c73df50fc8d86f46"; sha256 = "00pm2x4kh4fm91r7nmik1v5jclkgh7gpxz13ambyqxbxbiqjq0vg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "ordered-collections" = pkgs.stdenv.mkDerivation { name = "ordered-collections"; version = "v2.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-ordered-collections.git"; rev = "f226bdf904a153746bda6b928fb32fb25bb2a319"; sha256 = "1p592g0s07c56639y71782af0zz5cndpjxd5w9n41hdszsz1b86h"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "orders" = pkgs.stdenv.mkDerivation { name = "orders"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-orders.git"; rev = "c25b7075426cf82bcb960495f28d2541c9a75510"; sha256 = "0wwy3ycjll0s590ra35zf5gjvs86w97rln09bj428axhg7cvfl0a"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "parallel" = pkgs.stdenv.mkDerivation { name = "parallel"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-parallel.git"; rev = "16b38a2e148639b04ae67e0ce63cc220da8857f7"; sha256 = "0x8mvhgs8ygqj34xgyhk6gixqm32p2ymm00zg0zdw13g3lil9p4x"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "partial" = pkgs.stdenv.mkDerivation { name = "partial"; version = "v3.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-partial.git"; rev = "2f0a5239efab68179a684603263bcec8f1489b08"; sha256 = "0acxf686hvaj793hyb7kfn9lf96kv3nk0lls2p9j095ylp55sldb"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "posix-types" = pkgs.stdenv.mkDerivation { name = "posix-types"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript-node/purescript-posix-types.git"; rev = "e562680fce64b67e26741a61a51160a04fd3e7fb"; sha256 = "1knhdnnmxx77qsjz3gk1ga7n713l303dxyn8zs46qh7p2hnkalkc"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "prelude" = pkgs.stdenv.mkDerivation { name = "prelude"; version = "v5.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-prelude.git"; rev = "68f8012bc2309d9bf5832cdf7316ad052d586905"; sha256 = "1x0cacvv9mmw80vy6f40y0p959q1dz28fwjswhyd7ws6npbklcy0"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "profunctor" = pkgs.stdenv.mkDerivation { name = "profunctor"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-profunctor.git"; rev = "4551b8e437a00268cc9b687cbe691d75e812e82b"; sha256 = "0fvd2xiv77sp4jd4spgdp4i9812p6pdzzbg4pa96mbr0h19jf39c"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "psci-support" = pkgs.stdenv.mkDerivation { name = "psci-support"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-psci-support.git"; rev = "f26fe8266a63494080476333e22f971404ea8846"; sha256 = "16vhf8hapd7rcgmafmjpiq7smhzdh3300f2idk1q4kk01yxn8ddj"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "purescript-language-cst-parser" = pkgs.stdenv.mkDerivation { name = "purescript-language-cst-parser"; version = "v0.9.2"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-language-cst-parser.git"; rev = "bb36765e325a4ef5368ce5b7dcbb8cb7ed03affa"; sha256 = "11m40fflgpar416sa1ni9dwd5yk9g1hl2ghhyk3fa2mkjjk0ncnz"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "record" = pkgs.stdenv.mkDerivation { name = "record"; version = "v3.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-record.git"; rev = "091495d61fcaa9d8d8232e7b800f403a3165a38f"; sha256 = "0yidfvwiajiv8xflfsi2p8dqnp0qmmcz9jry58jyn9ga82z2pqn6"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "refs" = pkgs.stdenv.mkDerivation { name = "refs"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-refs.git"; rev = "f66d3cdf6a6bf4510e5181b3fac215054d8f1e2e"; sha256 = "1jhc2v784jy8bvkqy4zsh2z7pnqrhwa8n5kx98xhxx73n1bf38sg"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "safe-coerce" = pkgs.stdenv.mkDerivation { name = "safe-coerce"; version = "v1.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-safe-coerce.git"; rev = "e719defd227d932da067a1f0d62a60b3d3ff3637"; sha256 = "0m942lc23317izspz1sxw957mwl9yb9bgk8dh23f7b3a8w9hh8ff"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "st" = pkgs.stdenv.mkDerivation { name = "st"; version = "v5.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-st.git"; rev = "994eb5e650f3caedac385dcc61694f691df57983"; sha256 = "14hz254f1y0k3v83z719np0ddrgbca0hdsd9dvv244i07vlvm2zj"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "strings" = pkgs.stdenv.mkDerivation { name = "strings"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-strings.git"; rev = "157e372a23e4becd594d7e7bff6f372a6f63dd82"; sha256 = "0hyaa4d8gyyvac2nxnwqkn2rvi5vax4bi4yv10mpk7rgb8rv7mb8"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "tailrec" = pkgs.stdenv.mkDerivation { name = "tailrec"; version = "v5.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-tailrec.git"; rev = "5fbf0ac05dc6ab1a228b2897630195eb7483b962"; sha256 = "1jjl2q2hyhjcdxpamzr1cdlxhmq2bl170x5p3jajb9zgwkqx0x22"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "transformers" = pkgs.stdenv.mkDerivation { name = "transformers"; version = "v5.1.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-transformers.git"; rev = "60ed3f64afd67112a8d0f07f510564e41355b5fb"; sha256 = "15ac1jia665mglxscj3gmbg4xmlnf7xgsrkh6mvx4ayvar529xzc"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "tuples" = pkgs.stdenv.mkDerivation { name = "tuples"; version = "v6.0.1"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-tuples.git"; rev = "d4fe8ffe9e8c512111ee0bc18a6ba0fd056a6773"; sha256 = "0s2ar2gih4r34km8r8dqngh21s8899yb93mb7mips08ndy3ajq3a"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "type-equality" = pkgs.stdenv.mkDerivation { name = "type-equality"; version = "v4.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-type-equality.git"; rev = "f7644468f22ed267a15d398173d234fa6f45e2e0"; sha256 = "126pg4zg3bsrn8dzvv75xp586nznxyswzgjlr7cag3ij3j1z0kl0"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "typelevel-prelude" = pkgs.stdenv.mkDerivation { name = "typelevel-prelude"; version = "v6.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-typelevel-prelude.git"; rev = "83ddcdb23d06c8d5ea6196596a70438f42cd4afd"; sha256 = "1vwf3yhn8mir5y41wvlyszkgd5fxvrcyfd0l8cn20c8vfq36yzgk"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "unfoldable" = pkgs.stdenv.mkDerivation { name = "unfoldable"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-unfoldable.git"; rev = "bbcc2b062b9b7d3d61f123cfb32cc8c7fb811aa6"; sha256 = "1v3bz04wj6hj7s6mcf49hajylg6w58n78q54sqi2ra2zq8h99kpw"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "unsafe-coerce" = pkgs.stdenv.mkDerivation { name = "unsafe-coerce"; version = "v5.0.0"; src = pkgs.fetchgit { url = "https://github.com/purescript/purescript-unsafe-coerce.git"; rev = "ee24f0d3b94bf925d9c50fcc2b449579580178c0"; sha256 = "0l2agnm1k910v4yp1hz19wrsrywsr5scb397762y7pigm3frzs8r"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; "variant" = pkgs.stdenv.mkDerivation { name = "variant"; version = "v7.0.3"; src = pkgs.fetchgit { url = "https://github.com/natefaubion/purescript-variant.git"; rev = "3f12411ede5edd342d25340c1babce9ae81d6793"; sha256 = "1q2pky3gf177ihy2zjzqvp1cj18ycaki9vm4ghw18p7hf256lqmc"; }; phases = "installPhase"; installPhase = "ln -s $src $out"; }; }; cpPackage = pkg: let target = ".spago/${pkg.name}/${pkg.version}"; in '' if [ ! -e ${target} ]; then echo "Installing ${target}." mkdir -p ${target} cp --no-preserve=mode,ownership,timestamp -r ${toString pkg.outPath}/* ${target} else echo "${target} already exists. Skipping." fi ''; getGlob = pkg: ''".spago/${pkg.name}/${pkg.version}/src/**/*.purs"''; getStoreGlob = pkg: ''"${pkg.outPath}/src/**/*.purs"''; in { inherit inputs; installSpagoStyle = pkgs.writeShellScriptBin "install-spago-style" '' set -e echo installing dependencies... ${builtins.toString (builtins.map cpPackage (builtins.attrValues inputs))} echo "echo done." ''; buildSpagoStyle = pkgs.writeShellScriptBin "build-spago-style" '' set -e echo building project... purs compile ${builtins.toString (builtins.map getGlob (builtins.attrValues inputs))} "$@" echo done. ''; buildFromNixStore = pkgs.writeShellScriptBin "build-from-store" '' set -e echo building project using sources from nix store... purs compile ${builtins.toString ( builtins.map getStoreGlob (builtins.attrValues inputs))} "$@" echo done. ''; mkBuildProjectOutput = { src, purs }: pkgs.stdenv.mkDerivation { name = "build-project-output"; src = src; buildInputs = [ purs ]; installPhase = '' mkdir -p $out purs compile "$src/**/*.purs" ${builtins.toString (builtins.map (x: ''"${x.outPath}/src/**/*.purs"'') (builtins.attrValues inputs))} mv output $out ''; }; }