From 7671340cb85bb0c64114c177dea109200ecf593d Mon Sep 17 00:00:00 2001 From: toastal Date: Thu, 26 Aug 2021 20:52:31 +0700 Subject: [PATCH] =?UTF-8?q?purs-tidy:=20spago2nix=20=E2=86=92=20node2nix,?= =?UTF-8?q?=200.4.6=20=E2=86=92=200.5.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It seems bundling was added this week so this is golden now. It is simpler, that’s for sure. --- default.nix | 2 +- purs-tidy/default.nix | 65 +-- purs-tidy/node-env.nix | 567 +++++++++++++++++++++ purs-tidy/node-packages.nix | 51 ++ purs-tidy/spago-packages.nix | 934 ----------------------------------- 5 files changed, 632 insertions(+), 987 deletions(-) create mode 100644 purs-tidy/node-env.nix create mode 100644 purs-tidy/node-packages.nix delete mode 100644 purs-tidy/spago-packages.nix diff --git a/default.nix b/default.nix index 80fe38a..f031459 100644 --- a/default.nix +++ b/default.nix @@ -89,7 +89,7 @@ let }; purs-tidy = import ./purs-tidy { - inherit pkgs purs; + inherit pkgs; }; psa = import ./psa { diff --git a/purs-tidy/default.nix b/purs-tidy/default.nix index b2c6c62..957a051 100644 --- a/purs-tidy/default.nix +++ b/purs-tidy/default.nix @@ -1,61 +1,22 @@ { pkgs ? import { 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; }) diff --git a/purs-tidy/node-env.nix b/purs-tidy/node-env.nix new file mode 100644 index 0000000..c2b7231 --- /dev/null +++ b/purs-tidy/node-env.nix @@ -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 <> $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 < {} }: - -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 - ''; - }; -} -- 2.45.2