From e89c611591577080cdcb27aee93cadca6d65e87b Mon Sep 17 00:00:00 2001 From: Pedro Pombeiro Date: Wed, 22 May 2019 18:04:45 +0200 Subject: [PATCH] Split into desktop and mobile versions --- .TOOLVERSIONS | 1 - derivation.nix | 11 +- nix/desktop/default.nix | 10 +- .../realm-node}/README.md | 0 nix/desktop/realm-node/default.nix | 30 + .../realm-node}/generate-nix.sh | 6 +- .../realm-node}/output/default.nix | 2 +- .../realm-node}/output/node-env.nix | 0 .../realm-node/output/node-packages.nix | 1890 +++++++++++++++++ nix/mobile/default.nix | 9 +- nix/mobile/realm-node/README.md | 13 + .../realm-node}/default.nix | 8 +- nix/mobile/realm-node/generate-nix.sh | 24 + nix/mobile/realm-node/output/default.nix | 17 + nix/mobile/realm-node/output/node-env.nix | 531 +++++ .../realm-node}/output/node-packages.nix | 437 +--- shell.nix | 1 + 17 files changed, 2642 insertions(+), 348 deletions(-) rename nix/{global-node-packages => desktop/realm-node}/README.md (100%) create mode 100644 nix/desktop/realm-node/default.nix rename nix/{global-node-packages => desktop/realm-node}/generate-nix.sh (67%) rename nix/{global-node-packages => desktop/realm-node}/output/default.nix (85%) rename nix/{global-node-packages => desktop/realm-node}/output/node-env.nix (100%) create mode 100644 nix/desktop/realm-node/output/node-packages.nix create mode 100644 nix/mobile/realm-node/README.md rename nix/{global-node-packages => mobile/realm-node}/default.nix (77%) create mode 100755 nix/mobile/realm-node/generate-nix.sh create mode 100644 nix/mobile/realm-node/output/default.nix create mode 100644 nix/mobile/realm-node/output/node-env.nix rename nix/{global-node-packages => mobile/realm-node}/output/node-packages.nix (84%) diff --git a/.TOOLVERSIONS b/.TOOLVERSIONS index d633a3165cc3..05bd699bd1dd 100644 --- a/.TOOLVERSIONS +++ b/.TOOLVERSIONS @@ -2,6 +2,5 @@ android-sdk-build-tools;28.0.1; android-sdk-platform;android-27; android-sdk;4333796;aa190cfd7299cd6a1c687355bb2764e4 nix;2.2.1; -react_native_cli;2.0.1; StatusImAppImage;20181208; StatusIm-Windows-base-image;20181113; \ No newline at end of file diff --git a/derivation.nix b/derivation.nix index b7c7daccab48..c7580380fab1 100644 --- a/derivation.nix +++ b/derivation.nix @@ -8,21 +8,16 @@ let # TODO: Try to use stdenv for iOS. The problem is with building iOS as the build is trying to pass parameters to Apple's ld that are meant for GNU's ld (e.g. -dynamiclib) stdenv' = pkgs.stdenvNoCC; gradle = pkgs.gradle_4_10; - statusDesktop = pkgs.callPackage ./nix/desktop { inherit target-os status-go; inherit (pkgs) darwin; nodejs = nodejs'; stdenv = stdenv'; }; - statusMobile = pkgs.callPackage ./nix/mobile { inherit target-os config status-go gradle; inherit (pkgs.xcodeenv) composeXcodeWrapper; stdenv = stdenv'; }; + statusDesktop = pkgs.callPackage ./nix/desktop { inherit target-os status-go pkgs; inherit (pkgs) darwin; stdenv = stdenv'; nodejs = nodejs'; }; + statusMobile = pkgs.callPackage ./nix/mobile { inherit target-os config pkgs status-go gradle; inherit (pkgs.xcodeenv) composeXcodeWrapper; stdenv = stdenv'; nodejs = nodejs'; }; status-go = pkgs.callPackage ./nix/status-go { inherit target-os; inherit (pkgs.xcodeenv) composeXcodeWrapper; inherit (statusMobile) xcodewrapperArgs; androidPkgs = statusMobile.androidComposition; }; nodejs' = pkgs.nodejs-10_x; yarn' = pkgs.yarn.override { nodejs = nodejs'; }; - nodeInputs = import ./nix/global-node-packages { - # The remaining dependencies come from Nixpkgs - inherit pkgs; - nodejs = nodejs'; - }; nodePkgBuildInputs = [ nodejs' pkgs.python27 # for e.g. gyp yarn' - ] ++ (builtins.attrValues nodeInputs); + ]; selectedSources = stdenv'.lib.optional platform.targetDesktop statusDesktop ++ stdenv'.lib.optional platform.targetMobile statusMobile; diff --git a/nix/desktop/default.nix b/nix/desktop/default.nix index 6531670999fe..b156f564ccc1 100644 --- a/nix/desktop/default.nix +++ b/nix/desktop/default.nix @@ -1,4 +1,4 @@ -{ stdenv, callPackage, target-os, +{ stdenv, pkgs, callPackage, target-os, cmake, extra-cmake-modules, file, status-go, darwin, nodejs }: @@ -15,6 +15,10 @@ let lib.optional platform.targetLinux linuxPlatform ++ lib.optional platform.targetDarwin darwinPlatform ++ lib.optional platform.targetWindows windowsPlatform; + nodeInputs = import ./realm-node { + # The remaining dependencies come from Nixpkgs + inherit pkgs nodejs; + }; in { @@ -24,6 +28,8 @@ in file snoreNotifySources qtkeychainSources - ] ++ lib.catAttrs "buildInputs" selectedSources; + ] ++ lib.catAttrs "buildInputs" selectedSources ++ + (builtins.attrValues nodeInputs); + shellHook = lib.concatStrings (lib.catAttrs "shellHook" (selectedSources ++ [ snoreNotifySources qtkeychainSources ])); } diff --git a/nix/global-node-packages/README.md b/nix/desktop/realm-node/README.md similarity index 100% rename from nix/global-node-packages/README.md rename to nix/desktop/realm-node/README.md diff --git a/nix/desktop/realm-node/default.nix b/nix/desktop/realm-node/default.nix new file mode 100644 index 000000000000..2829f06550e8 --- /dev/null +++ b/nix/desktop/realm-node/default.nix @@ -0,0 +1,30 @@ +{ pkgs, nodejs }: + +let nodePackages = import ./output { inherit pkgs nodejs; }; + realm-version = "5.12.1"; + realm-patched-name = "realm-https://github.com/status-im/realm-js/archive/v2.20.1.tar.gz"; + realm-core-src = pkgs.fetchurl ( + if builtins.currentSystem == "x86_64-darwin" then { + url = "https://static.realm.io/downloads/core/realm-core-Release-v${realm-version}-Darwin-devel.tar.gz"; + sha256 = "05ji1zyskwjj8p5i01kcg7h1cxdjj62fcsp6haf2f65qshp6r44d"; + } else { + url = "https://static.realm.io/downloads/core/realm-core-Release-v${realm-version}-Linux-devel.tar.gz"; + sha256 = "02pvi28qnvzdv7ghqzf79bxn8id9s7mpp3g2ambxg8jrcrkqfvr1"; + } + ); + realm-dest-dir = if builtins.currentSystem == "x86_64-darwin" then + "$out/lib/node_modules/realm/compiled/node-v64_darwin_x64/realm.node" else + "$out/lib/node_modules/realm/compiled/node-v64_linux_x64/realm.node"; +in nodePackages // { + ${realm-patched-name} = nodePackages.${realm-patched-name}.override(oldAttrs: { + buildInputs = oldAttrs.buildInputs ++ [ pkgs.nodePackages.node-pre-gyp ]; + reconstructLock = true; + preRebuild = '' + # Do not attempt to do any http calls! + substituteInPlace $out/lib/node_modules/realm/scripts/download-realm.js \ + --replace "!shouldSkipAcquire(realmDir, requirements, options.force)" "false" + mkdir -p ${realm-dest-dir} + tar -xzf ${realm-core-src} -C ${realm-dest-dir} + ''; + }); +} diff --git a/nix/global-node-packages/generate-nix.sh b/nix/desktop/realm-node/generate-nix.sh similarity index 67% rename from nix/global-node-packages/generate-nix.sh rename to nix/desktop/realm-node/generate-nix.sh index 39945831b1df..da3acd593c70 100755 --- a/nix/global-node-packages/generate-nix.sh +++ b/nix/desktop/realm-node/generate-nix.sh @@ -8,18 +8,16 @@ input="${dir}/output/node-packages.json" output_dir="${dir}/output" rm -rf $output_dir && mkdir -p $output_dir -react_native_cli_required_version=$($toolversion react_native_cli) cat << EOF > $input [ - { "react-native-cli": "${react_native_cli_required_version}", - "realm": "git+https://github.com/status-im/realm-js.git#heads/v2.20.1" } + { "realm": "https://github.com/status-im/realm-js/archive/v2.20.1.tar.gz" } ] EOF node_required_version=$($toolversion node) node_major_version=$(echo $node_required_version | cut -d. -f1,1) -node2nix --nodejs-${node_major_version} -i $input \ +node2nix --nodejs-${node_major_version} --bypass-cache -i $input \ -o $output_dir/node-packages.nix \ -c $output_dir/default.nix \ -e $output_dir/node-env.nix diff --git a/nix/global-node-packages/output/default.nix b/nix/desktop/realm-node/output/default.nix similarity index 85% rename from nix/global-node-packages/output/default.nix rename to nix/desktop/realm-node/output/default.nix index 6689fdd16f75..f2ba5a4d8d74 100644 --- a/nix/global-node-packages/output/default.nix +++ b/nix/desktop/realm-node/output/default.nix @@ -2,7 +2,7 @@ {pkgs ? import { inherit system; - }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-10_x"}: + }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-6_x"}: let nodeEnv = import ./node-env.nix { diff --git a/nix/global-node-packages/output/node-env.nix b/nix/desktop/realm-node/output/node-env.nix similarity index 100% rename from nix/global-node-packages/output/node-env.nix rename to nix/desktop/realm-node/output/node-env.nix diff --git a/nix/desktop/realm-node/output/node-packages.nix b/nix/desktop/realm-node/output/node-packages.nix new file mode 100644 index 000000000000..7dd2bf8226be --- /dev/null +++ b/nix/desktop/realm-node/output/node-packages.nix @@ -0,0 +1,1890 @@ +# This file has been generated by node2nix 1.6.1. Do not edit! + +{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}: + +let + sources = { + "abbrev-1.1.1" = { + name = "abbrev"; + packageName = "abbrev"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"; + sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="; + }; + }; + "ajv-6.10.0" = { + name = "ajv"; + packageName = "ajv"; + version = "6.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz"; + sha512 = "nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg=="; + }; + }; + "ansi-regex-2.1.1" = { + name = "ansi-regex"; + packageName = "ansi-regex"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"; + sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df"; + }; + }; + "aproba-1.2.0" = { + name = "aproba"; + packageName = "aproba"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz"; + sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="; + }; + }; + "are-we-there-yet-1.1.5" = { + name = "are-we-there-yet"; + packageName = "are-we-there-yet"; + version = "1.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz"; + sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w=="; + }; + }; + "array-back-1.0.4" = { + name = "array-back"; + packageName = "array-back"; + version = "1.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz"; + sha1 = "644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b"; + }; + }; + "array-back-2.0.0" = { + name = "array-back"; + packageName = "array-back"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz"; + sha512 = "eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw=="; + }; + }; + "asap-2.0.6" = { + name = "asap"; + packageName = "asap"; + version = "2.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"; + sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46"; + }; + }; + "asn1-0.2.4" = { + name = "asn1"; + packageName = "asn1"; + version = "0.2.4"; + src = fetchurl { + url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz"; + sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg=="; + }; + }; + "assert-plus-1.0.0" = { + name = "assert-plus"; + packageName = "assert-plus"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"; + sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"; + }; + }; + "asynckit-0.4.0" = { + name = "asynckit"; + packageName = "asynckit"; + version = "0.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"; + sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"; + }; + }; + "aws-sign2-0.7.0" = { + name = "aws-sign2"; + packageName = "aws-sign2"; + version = "0.7.0"; + src = fetchurl { + url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"; + sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"; + }; + }; + "aws4-1.8.0" = { + name = "aws4"; + packageName = "aws4"; + version = "1.8.0"; + src = fetchurl { + url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz"; + sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="; + }; + }; + "balanced-match-1.0.0" = { + name = "balanced-match"; + packageName = "balanced-match"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz"; + sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767"; + }; + }; + "base64-js-1.3.0" = { + name = "base64-js"; + packageName = "base64-js"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz"; + sha512 = "ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="; + }; + }; + "bcrypt-pbkdf-1.0.2" = { + name = "bcrypt-pbkdf"; + packageName = "bcrypt-pbkdf"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"; + sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"; + }; + }; + "bl-1.2.2" = { + name = "bl"; + packageName = "bl"; + version = "1.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz"; + sha512 = "e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA=="; + }; + }; + "brace-expansion-1.1.11" = { + name = "brace-expansion"; + packageName = "brace-expansion"; + version = "1.1.11"; + src = fetchurl { + url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"; + sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="; + }; + }; + "buffer-5.2.1" = { + name = "buffer"; + packageName = "buffer"; + version = "5.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz"; + sha512 = "c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg=="; + }; + }; + "buffer-alloc-1.2.0" = { + name = "buffer-alloc"; + packageName = "buffer-alloc"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz"; + sha512 = "CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow=="; + }; + }; + "buffer-alloc-unsafe-1.1.0" = { + name = "buffer-alloc-unsafe"; + packageName = "buffer-alloc-unsafe"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz"; + sha512 = "TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="; + }; + }; + "buffer-crc32-0.2.13" = { + name = "buffer-crc32"; + packageName = "buffer-crc32"; + version = "0.2.13"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz"; + sha1 = "0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"; + }; + }; + "buffer-fill-1.0.0" = { + name = "buffer-fill"; + packageName = "buffer-fill"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz"; + sha1 = "f8f78b76789888ef39f205cd637f68e702122b2c"; + }; + }; + "buffer-from-1.1.1" = { + name = "buffer-from"; + packageName = "buffer-from"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"; + sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="; + }; + }; + "caseless-0.11.0" = { + name = "caseless"; + packageName = "caseless"; + version = "0.11.0"; + src = fetchurl { + url = "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz"; + sha1 = "715b96ea9841593cc33067923f5ec60ebda4f7d7"; + }; + }; + "caseless-0.12.0" = { + name = "caseless"; + packageName = "caseless"; + version = "0.12.0"; + src = fetchurl { + url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"; + sha1 = "1b681c21ff84033c826543090689420d187151dc"; + }; + }; + "chownr-1.1.1" = { + name = "chownr"; + packageName = "chownr"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz"; + sha512 = "j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g=="; + }; + }; + "code-point-at-1.1.0" = { + name = "code-point-at"; + packageName = "code-point-at"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz"; + sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"; + }; + }; + "combined-stream-1.0.8" = { + name = "combined-stream"; + packageName = "combined-stream"; + version = "1.0.8"; + src = fetchurl { + url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"; + sha512 = "FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="; + }; + }; + "command-line-args-4.0.7" = { + name = "command-line-args"; + packageName = "command-line-args"; + version = "4.0.7"; + src = fetchurl { + url = "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz"; + sha512 = "aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA=="; + }; + }; + "commander-2.8.1" = { + name = "commander"; + packageName = "commander"; + version = "2.8.1"; + src = fetchurl { + url = "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz"; + sha1 = "06be367febfda0c330aa1e2a072d3dc9762425d4"; + }; + }; + "concat-map-0.0.1" = { + name = "concat-map"; + packageName = "concat-map"; + version = "0.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"; + sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b"; + }; + }; + "concat-stream-1.6.2" = { + name = "concat-stream"; + packageName = "concat-stream"; + version = "1.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz"; + sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="; + }; + }; + "console-control-strings-1.1.0" = { + name = "console-control-strings"; + packageName = "console-control-strings"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"; + sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e"; + }; + }; + "core-util-is-1.0.2" = { + name = "core-util-is"; + packageName = "core-util-is"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"; + sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7"; + }; + }; + "dashdash-1.14.1" = { + name = "dashdash"; + packageName = "dashdash"; + version = "1.14.1"; + src = fetchurl { + url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz"; + sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"; + }; + }; + "debug-3.2.6" = { + name = "debug"; + packageName = "debug"; + version = "3.2.6"; + src = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz"; + sha512 = "mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ=="; + }; + }; + "decompress-4.2.0" = { + name = "decompress"; + packageName = "decompress"; + version = "4.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz"; + sha1 = "7aedd85427e5a92dacfe55674a7c505e96d01f9d"; + }; + }; + "decompress-tar-4.1.1" = { + name = "decompress-tar"; + packageName = "decompress-tar"; + version = "4.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz"; + sha512 = "JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ=="; + }; + }; + "decompress-tarbz2-4.1.1" = { + name = "decompress-tarbz2"; + packageName = "decompress-tarbz2"; + version = "4.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz"; + sha512 = "s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A=="; + }; + }; + "decompress-targz-4.1.1" = { + name = "decompress-targz"; + packageName = "decompress-targz"; + version = "4.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz"; + sha512 = "4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w=="; + }; + }; + "decompress-unzip-4.0.1" = { + name = "decompress-unzip"; + packageName = "decompress-unzip"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz"; + sha1 = "deaaccdfd14aeaf85578f733ae8210f9b4848f69"; + }; + }; + "deep-extend-0.6.0" = { + name = "deep-extend"; + packageName = "deep-extend"; + version = "0.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"; + sha512 = "LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="; + }; + }; + "deepmerge-2.1.0" = { + name = "deepmerge"; + packageName = "deepmerge"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/deepmerge/-/deepmerge-2.1.0.tgz"; + sha512 = "Q89Z26KAfA3lpPGhbF6XMfYAm3jIV3avViy6KOJ2JLzFbeWHOvPQUu5aSJIWXap3gDZC2y1eF5HXEPI2wGqgvw=="; + }; + }; + "delayed-stream-1.0.0" = { + name = "delayed-stream"; + packageName = "delayed-stream"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"; + sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619"; + }; + }; + "delegates-1.0.0" = { + name = "delegates"; + packageName = "delegates"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"; + sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a"; + }; + }; + "detect-libc-1.0.3" = { + name = "detect-libc"; + packageName = "detect-libc"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz"; + sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"; + }; + }; + "ecc-jsbn-0.1.2" = { + name = "ecc-jsbn"; + packageName = "ecc-jsbn"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"; + sha1 = "3a83a904e54353287874c564b7549386849a98c9"; + }; + }; + "encoding-0.1.12" = { + name = "encoding"; + packageName = "encoding"; + version = "0.1.12"; + src = fetchurl { + url = "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz"; + sha1 = "538b66f3ee62cd1ab51ec323829d1f9480c74beb"; + }; + }; + "end-of-stream-1.4.1" = { + name = "end-of-stream"; + packageName = "end-of-stream"; + version = "1.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz"; + sha512 = "1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q=="; + }; + }; + "extend-3.0.2" = { + name = "extend"; + packageName = "extend"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"; + sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="; + }; + }; + "extsprintf-1.3.0" = { + name = "extsprintf"; + packageName = "extsprintf"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"; + sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05"; + }; + }; + "fast-deep-equal-2.0.1" = { + name = "fast-deep-equal"; + packageName = "fast-deep-equal"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz"; + sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"; + }; + }; + "fast-json-stable-stringify-2.0.0" = { + name = "fast-json-stable-stringify"; + packageName = "fast-json-stable-stringify"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz"; + sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2"; + }; + }; + "fd-slicer-1.1.0" = { + name = "fd-slicer"; + packageName = "fd-slicer"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz"; + sha1 = "25c7c89cb1f9077f8891bbe61d8f390eae256f1e"; + }; + }; + "file-type-3.9.0" = { + name = "file-type"; + packageName = "file-type"; + version = "3.9.0"; + src = fetchurl { + url = "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz"; + sha1 = "257a078384d1db8087bc449d107d52a52672b9e9"; + }; + }; + "file-type-5.2.0" = { + name = "file-type"; + packageName = "file-type"; + version = "5.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz"; + sha1 = "2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"; + }; + }; + "file-type-6.2.0" = { + name = "file-type"; + packageName = "file-type"; + version = "6.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz"; + sha512 = "YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg=="; + }; + }; + "find-replace-1.0.3" = { + name = "find-replace"; + packageName = "find-replace"; + version = "1.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz"; + sha1 = "b88e7364d2d9c959559f388c66670d6130441fa0"; + }; + }; + "forever-agent-0.6.1" = { + name = "forever-agent"; + packageName = "forever-agent"; + version = "0.6.1"; + src = fetchurl { + url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"; + sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"; + }; + }; + "form-data-2.3.3" = { + name = "form-data"; + packageName = "form-data"; + version = "2.3.3"; + src = fetchurl { + url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz"; + sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="; + }; + }; + "fs-constants-1.0.0" = { + name = "fs-constants"; + packageName = "fs-constants"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz"; + sha512 = "y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="; + }; + }; + "fs-extra-4.0.3" = { + name = "fs-extra"; + packageName = "fs-extra"; + version = "4.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz"; + sha512 = "q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg=="; + }; + }; + "fs-minipass-1.2.6" = { + name = "fs-minipass"; + packageName = "fs-minipass"; + version = "1.2.6"; + src = fetchurl { + url = "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz"; + sha512 = "crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ=="; + }; + }; + "fs.realpath-1.0.0" = { + name = "fs.realpath"; + packageName = "fs.realpath"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"; + sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f"; + }; + }; + "gauge-2.7.4" = { + name = "gauge"; + packageName = "gauge"; + version = "2.7.4"; + src = fetchurl { + url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz"; + sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7"; + }; + }; + "get-stream-2.3.1" = { + name = "get-stream"; + packageName = "get-stream"; + version = "2.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz"; + sha1 = "5f38f93f346009666ee0150a054167f91bdd95de"; + }; + }; + "getpass-0.1.7" = { + name = "getpass"; + packageName = "getpass"; + version = "0.1.7"; + src = fetchurl { + url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz"; + sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa"; + }; + }; + "glob-7.1.4" = { + name = "glob"; + packageName = "glob"; + version = "7.1.4"; + src = fetchurl { + url = "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz"; + sha512 = "hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A=="; + }; + }; + "graceful-fs-4.1.15" = { + name = "graceful-fs"; + packageName = "graceful-fs"; + version = "4.1.15"; + src = fetchurl { + url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz"; + sha512 = "6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="; + }; + }; + "graceful-readlink-1.0.1" = { + name = "graceful-readlink"; + packageName = "graceful-readlink"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"; + sha1 = "4cafad76bc62f02fa039b2f94e9a3dd3a391a725"; + }; + }; + "har-schema-2.0.0" = { + name = "har-schema"; + packageName = "har-schema"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz"; + sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92"; + }; + }; + "har-validator-5.1.3" = { + name = "har-validator"; + packageName = "har-validator"; + version = "5.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz"; + sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g=="; + }; + }; + "has-unicode-2.0.1" = { + name = "has-unicode"; + packageName = "has-unicode"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"; + sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9"; + }; + }; + "http-basic-2.5.1" = { + name = "http-basic"; + packageName = "http-basic"; + version = "2.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/http-basic/-/http-basic-2.5.1.tgz"; + sha1 = "8ce447bdb5b6c577f8a63e3fa78056ec4bb4dbfb"; + }; + }; + "http-response-object-1.1.0" = { + name = "http-response-object"; + packageName = "http-response-object"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/http-response-object/-/http-response-object-1.1.0.tgz"; + sha1 = "a7c4e75aae82f3bb4904e4f43f615673b4d518c3"; + }; + }; + "http-signature-1.2.0" = { + name = "http-signature"; + packageName = "http-signature"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz"; + sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1"; + }; + }; + "iconv-lite-0.4.24" = { + name = "iconv-lite"; + packageName = "iconv-lite"; + version = "0.4.24"; + src = fetchurl { + url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"; + sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="; + }; + }; + "ieee754-1.1.13" = { + name = "ieee754"; + packageName = "ieee754"; + version = "1.1.13"; + src = fetchurl { + url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"; + sha512 = "4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="; + }; + }; + "ignore-walk-3.0.1" = { + name = "ignore-walk"; + packageName = "ignore-walk"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz"; + sha512 = "DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ=="; + }; + }; + "inflight-1.0.6" = { + name = "inflight"; + packageName = "inflight"; + version = "1.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"; + sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9"; + }; + }; + "inherits-2.0.3" = { + name = "inherits"; + packageName = "inherits"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"; + sha1 = "633c2c83e3da42a502f52466022480f4208261de"; + }; + }; + "ini-1.3.5" = { + name = "ini"; + packageName = "ini"; + version = "1.3.5"; + src = fetchurl { + url = "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz"; + sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="; + }; + }; + "is-fullwidth-code-point-1.0.0" = { + name = "is-fullwidth-code-point"; + packageName = "is-fullwidth-code-point"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz"; + sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb"; + }; + }; + "is-natural-number-4.0.1" = { + name = "is-natural-number"; + packageName = "is-natural-number"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz"; + sha1 = "ab9d76e1db4ced51e35de0c72ebecf09f734cde8"; + }; + }; + "is-stream-1.1.0" = { + name = "is-stream"; + packageName = "is-stream"; + version = "1.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"; + sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"; + }; + }; + "is-typedarray-1.0.0" = { + name = "is-typedarray"; + packageName = "is-typedarray"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"; + sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a"; + }; + }; + "isarray-1.0.0" = { + name = "isarray"; + packageName = "isarray"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"; + sha1 = "bb935d48582cba168c06834957a54a3e07124f11"; + }; + }; + "isstream-0.1.2" = { + name = "isstream"; + packageName = "isstream"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"; + sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a"; + }; + }; + "js-tokens-4.0.0" = { + name = "js-tokens"; + packageName = "js-tokens"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"; + sha512 = "RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="; + }; + }; + "jsbn-0.1.1" = { + name = "jsbn"; + packageName = "jsbn"; + version = "0.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"; + sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"; + }; + }; + "json-schema-0.2.3" = { + name = "json-schema"; + packageName = "json-schema"; + version = "0.2.3"; + src = fetchurl { + url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"; + sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13"; + }; + }; + "json-schema-traverse-0.4.1" = { + name = "json-schema-traverse"; + packageName = "json-schema-traverse"; + version = "0.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"; + sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="; + }; + }; + "json-stringify-safe-5.0.1" = { + name = "json-stringify-safe"; + packageName = "json-stringify-safe"; + version = "5.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"; + sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"; + }; + }; + "jsonfile-4.0.0" = { + name = "jsonfile"; + packageName = "jsonfile"; + version = "4.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"; + sha1 = "8771aae0799b64076b76640fca058f9c10e33ecb"; + }; + }; + "jsprim-1.4.1" = { + name = "jsprim"; + packageName = "jsprim"; + version = "1.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz"; + sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"; + }; + }; + "loose-envify-1.4.0" = { + name = "loose-envify"; + packageName = "loose-envify"; + version = "1.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"; + sha512 = "lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="; + }; + }; + "make-dir-1.3.0" = { + name = "make-dir"; + packageName = "make-dir"; + version = "1.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz"; + sha512 = "2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ=="; + }; + }; + "mime-db-1.40.0" = { + name = "mime-db"; + packageName = "mime-db"; + version = "1.40.0"; + src = fetchurl { + url = "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz"; + sha512 = "jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="; + }; + }; + "mime-types-2.1.24" = { + name = "mime-types"; + packageName = "mime-types"; + version = "2.1.24"; + src = fetchurl { + url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz"; + sha512 = "WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ=="; + }; + }; + "minimatch-3.0.4" = { + name = "minimatch"; + packageName = "minimatch"; + version = "3.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"; + sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="; + }; + }; + "minimist-0.0.8" = { + name = "minimist"; + packageName = "minimist"; + version = "0.0.8"; + src = fetchurl { + url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"; + sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d"; + }; + }; + "minimist-1.2.0" = { + name = "minimist"; + packageName = "minimist"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz"; + sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284"; + }; + }; + "minipass-2.3.5" = { + name = "minipass"; + packageName = "minipass"; + version = "2.3.5"; + src = fetchurl { + url = "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz"; + sha512 = "Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA=="; + }; + }; + "minizlib-1.2.1" = { + name = "minizlib"; + packageName = "minizlib"; + version = "1.2.1"; + src = fetchurl { + url = "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz"; + sha512 = "7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA=="; + }; + }; + "mkdirp-0.5.1" = { + name = "mkdirp"; + packageName = "mkdirp"; + version = "0.5.1"; + src = fetchurl { + url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz"; + sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903"; + }; + }; + "ms-2.1.1" = { + name = "ms"; + packageName = "ms"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz"; + sha512 = "tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="; + }; + }; + "nan-2.14.0" = { + name = "nan"; + packageName = "nan"; + version = "2.14.0"; + src = fetchurl { + url = "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz"; + sha512 = "INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="; + }; + }; + "needle-2.4.0" = { + name = "needle"; + packageName = "needle"; + version = "2.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz"; + sha512 = "4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg=="; + }; + }; + "node-fetch-1.7.3" = { + name = "node-fetch"; + packageName = "node-fetch"; + version = "1.7.3"; + src = fetchurl { + url = "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz"; + sha512 = "NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ=="; + }; + }; + "node-machine-id-1.1.10" = { + name = "node-machine-id"; + packageName = "node-machine-id"; + version = "1.1.10"; + src = fetchurl { + url = "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.10.tgz"; + sha512 = "6SVxo3Ic2Qc09z1rCJh3No7ubizPLszImsMQnZZWfzeOC6SYU4orN214++c3ikB8uaP/A6dwSlO88A3ohI5oNA=="; + }; + }; + "node-pre-gyp-0.11.0" = { + name = "node-pre-gyp"; + packageName = "node-pre-gyp"; + version = "0.11.0"; + src = fetchurl { + url = "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz"; + sha512 = "TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q=="; + }; + }; + "nopt-4.0.1" = { + name = "nopt"; + packageName = "nopt"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz"; + sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d"; + }; + }; + "npm-bundled-1.0.6" = { + name = "npm-bundled"; + packageName = "npm-bundled"; + version = "1.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz"; + sha512 = "8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g=="; + }; + }; + "npm-packlist-1.4.1" = { + name = "npm-packlist"; + packageName = "npm-packlist"; + version = "1.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz"; + sha512 = "+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw=="; + }; + }; + "npmlog-4.1.2" = { + name = "npmlog"; + packageName = "npmlog"; + version = "4.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz"; + sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="; + }; + }; + "number-is-nan-1.0.1" = { + name = "number-is-nan"; + packageName = "number-is-nan"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz"; + sha1 = "097b602b53422a522c1afb8790318336941a011d"; + }; + }; + "oauth-sign-0.9.0" = { + name = "oauth-sign"; + packageName = "oauth-sign"; + version = "0.9.0"; + src = fetchurl { + url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"; + sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="; + }; + }; + "object-assign-4.1.1" = { + name = "object-assign"; + packageName = "object-assign"; + version = "4.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"; + sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863"; + }; + }; + "once-1.4.0" = { + name = "once"; + packageName = "once"; + version = "1.4.0"; + src = fetchurl { + url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz"; + sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1"; + }; + }; + "os-homedir-1.0.2" = { + name = "os-homedir"; + packageName = "os-homedir"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz"; + sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3"; + }; + }; + "os-tmpdir-1.0.2" = { + name = "os-tmpdir"; + packageName = "os-tmpdir"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"; + sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274"; + }; + }; + "osenv-0.1.5" = { + name = "osenv"; + packageName = "osenv"; + version = "0.1.5"; + src = fetchurl { + url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz"; + sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g=="; + }; + }; + "path-is-absolute-1.0.1" = { + name = "path-is-absolute"; + packageName = "path-is-absolute"; + version = "1.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"; + sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"; + }; + }; + "pend-1.2.0" = { + name = "pend"; + packageName = "pend"; + version = "1.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz"; + sha1 = "7a57eb550a6783f9115331fcf4663d5c8e007a50"; + }; + }; + "performance-now-2.1.0" = { + name = "performance-now"; + packageName = "performance-now"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"; + sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"; + }; + }; + "pify-2.3.0" = { + name = "pify"; + packageName = "pify"; + version = "2.3.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"; + sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c"; + }; + }; + "pify-3.0.0" = { + name = "pify"; + packageName = "pify"; + version = "3.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz"; + sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"; + }; + }; + "pinkie-2.0.4" = { + name = "pinkie"; + packageName = "pinkie"; + version = "2.0.4"; + src = fetchurl { + url = "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"; + sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870"; + }; + }; + "pinkie-promise-2.0.1" = { + name = "pinkie-promise"; + packageName = "pinkie-promise"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"; + sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa"; + }; + }; + "process-nextick-args-2.0.0" = { + name = "process-nextick-args"; + packageName = "process-nextick-args"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz"; + sha512 = "MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="; + }; + }; + "progress-2.0.3" = { + name = "progress"; + packageName = "progress"; + version = "2.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"; + sha512 = "7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="; + }; + }; + "promise-7.3.1" = { + name = "promise"; + packageName = "promise"; + version = "7.3.1"; + src = fetchurl { + url = "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz"; + sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="; + }; + }; + "prop-types-15.7.2" = { + name = "prop-types"; + packageName = "prop-types"; + version = "15.7.2"; + src = fetchurl { + url = "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz"; + sha512 = "8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ=="; + }; + }; + "psl-1.1.31" = { + name = "psl"; + packageName = "psl"; + version = "1.1.31"; + src = fetchurl { + url = "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz"; + sha512 = "/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="; + }; + }; + "punycode-1.4.1" = { + name = "punycode"; + packageName = "punycode"; + version = "1.4.1"; + src = fetchurl { + url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz"; + sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"; + }; + }; + "punycode-2.1.1" = { + name = "punycode"; + packageName = "punycode"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"; + sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="; + }; + }; + "qs-6.5.2" = { + name = "qs"; + packageName = "qs"; + version = "6.5.2"; + src = fetchurl { + url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz"; + sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="; + }; + }; + "querystringify-2.1.1" = { + name = "querystringify"; + packageName = "querystringify"; + version = "2.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz"; + sha512 = "w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="; + }; + }; + "rc-1.2.8" = { + name = "rc"; + packageName = "rc"; + version = "1.2.8"; + src = fetchurl { + url = "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz"; + sha512 = "y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="; + }; + }; + "react-is-16.8.6" = { + name = "react-is"; + packageName = "react-is"; + version = "16.8.6"; + src = fetchurl { + url = "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz"; + sha512 = "aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA=="; + }; + }; + "readable-stream-2.3.6" = { + name = "readable-stream"; + packageName = "readable-stream"; + version = "2.3.6"; + src = fetchurl { + url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz"; + sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw=="; + }; + }; + "request-2.88.0" = { + name = "request"; + packageName = "request"; + version = "2.88.0"; + src = fetchurl { + url = "https://registry.npmjs.org/request/-/request-2.88.0.tgz"; + sha512 = "NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg=="; + }; + }; + "requires-port-1.0.0" = { + name = "requires-port"; + packageName = "requires-port"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"; + sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff"; + }; + }; + "rimraf-2.6.3" = { + name = "rimraf"; + packageName = "rimraf"; + version = "2.6.3"; + src = fetchurl { + url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz"; + sha512 = "mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="; + }; + }; + "safe-buffer-5.1.2" = { + name = "safe-buffer"; + packageName = "safe-buffer"; + version = "5.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"; + sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="; + }; + }; + "safer-buffer-2.1.2" = { + name = "safer-buffer"; + packageName = "safer-buffer"; + version = "2.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"; + sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="; + }; + }; + "sax-1.2.4" = { + name = "sax"; + packageName = "sax"; + version = "1.2.4"; + src = fetchurl { + url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz"; + sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="; + }; + }; + "seek-bzip-1.0.5" = { + name = "seek-bzip"; + packageName = "seek-bzip"; + version = "1.0.5"; + src = fetchurl { + url = "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz"; + sha1 = "cfe917cb3d274bcffac792758af53173eb1fabdc"; + }; + }; + "semver-5.7.0" = { + name = "semver"; + packageName = "semver"; + version = "5.7.0"; + src = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz"; + sha512 = "Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="; + }; + }; + "set-blocking-2.0.0" = { + name = "set-blocking"; + packageName = "set-blocking"; + version = "2.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"; + sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7"; + }; + }; + "signal-exit-3.0.2" = { + name = "signal-exit"; + packageName = "signal-exit"; + version = "3.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz"; + sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d"; + }; + }; + "sshpk-1.16.1" = { + name = "sshpk"; + packageName = "sshpk"; + version = "1.16.1"; + src = fetchurl { + url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz"; + sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg=="; + }; + }; + "stream-counter-1.0.0" = { + name = "stream-counter"; + packageName = "stream-counter"; + version = "1.0.0"; + src = fetchurl { + url = "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz"; + sha1 = "91cf2569ce4dc5061febcd7acb26394a5a114751"; + }; + }; + "string-width-1.0.2" = { + name = "string-width"; + packageName = "string-width"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz"; + sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"; + }; + }; + "string_decoder-1.1.1" = { + name = "string_decoder"; + packageName = "string_decoder"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"; + sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="; + }; + }; + "strip-ansi-3.0.1" = { + name = "strip-ansi"; + packageName = "strip-ansi"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"; + sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"; + }; + }; + "strip-dirs-2.1.0" = { + name = "strip-dirs"; + packageName = "strip-dirs"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz"; + sha512 = "JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g=="; + }; + }; + "strip-json-comments-2.0.1" = { + name = "strip-json-comments"; + packageName = "strip-json-comments"; + version = "2.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"; + sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a"; + }; + }; + "sync-request-3.0.1" = { + name = "sync-request"; + packageName = "sync-request"; + version = "3.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/sync-request/-/sync-request-3.0.1.tgz"; + sha1 = "caa1235aaf889ba501076a1834c436830a82fb73"; + }; + }; + "tar-4.4.8" = { + name = "tar"; + packageName = "tar"; + version = "4.4.8"; + src = fetchurl { + url = "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz"; + sha512 = "LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ=="; + }; + }; + "tar-stream-1.6.2" = { + name = "tar-stream"; + packageName = "tar-stream"; + version = "1.6.2"; + src = fetchurl { + url = "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz"; + sha512 = "rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A=="; + }; + }; + "test-value-2.1.0" = { + name = "test-value"; + packageName = "test-value"; + version = "2.1.0"; + src = fetchurl { + url = "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz"; + sha1 = "11da6ff670f3471a73b625ca4f3fdcf7bb748291"; + }; + }; + "then-request-2.2.0" = { + name = "then-request"; + packageName = "then-request"; + version = "2.2.0"; + src = fetchurl { + url = "https://registry.npmjs.org/then-request/-/then-request-2.2.0.tgz"; + sha1 = "6678b32fa0ca218fe569981bbd8871b594060d81"; + }; + }; + "through-2.3.8" = { + name = "through"; + packageName = "through"; + version = "2.3.8"; + src = fetchurl { + url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz"; + sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"; + }; + }; + "to-buffer-1.1.1" = { + name = "to-buffer"; + packageName = "to-buffer"; + version = "1.1.1"; + src = fetchurl { + url = "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz"; + sha512 = "lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="; + }; + }; + "tough-cookie-2.4.3" = { + name = "tough-cookie"; + packageName = "tough-cookie"; + version = "2.4.3"; + src = fetchurl { + url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz"; + sha512 = "Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ=="; + }; + }; + "tunnel-agent-0.6.0" = { + name = "tunnel-agent"; + packageName = "tunnel-agent"; + version = "0.6.0"; + src = fetchurl { + url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"; + sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd"; + }; + }; + "tweetnacl-0.14.5" = { + name = "tweetnacl"; + packageName = "tweetnacl"; + version = "0.14.5"; + src = fetchurl { + url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz"; + sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64"; + }; + }; + "typedarray-0.0.6" = { + name = "typedarray"; + packageName = "typedarray"; + version = "0.0.6"; + src = fetchurl { + url = "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"; + sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777"; + }; + }; + "typical-2.6.1" = { + name = "typical"; + packageName = "typical"; + version = "2.6.1"; + src = fetchurl { + url = "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz"; + sha1 = "5c080e5d661cbbe38259d2e70a3c7253e873881d"; + }; + }; + "unbzip2-stream-1.3.3" = { + name = "unbzip2-stream"; + packageName = "unbzip2-stream"; + version = "1.3.3"; + src = fetchurl { + url = "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz"; + sha512 = "fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg=="; + }; + }; + "universalify-0.1.2" = { + name = "universalify"; + packageName = "universalify"; + version = "0.1.2"; + src = fetchurl { + url = "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"; + sha512 = "rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="; + }; + }; + "uri-js-4.2.2" = { + name = "uri-js"; + packageName = "uri-js"; + version = "4.2.2"; + src = fetchurl { + url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz"; + sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ=="; + }; + }; + "url-parse-1.4.7" = { + name = "url-parse"; + packageName = "url-parse"; + version = "1.4.7"; + src = fetchurl { + url = "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz"; + sha512 = "d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg=="; + }; + }; + "util-deprecate-1.0.2" = { + name = "util-deprecate"; + packageName = "util-deprecate"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"; + sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf"; + }; + }; + "uuid-3.3.2" = { + name = "uuid"; + packageName = "uuid"; + version = "3.3.2"; + src = fetchurl { + url = "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz"; + sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="; + }; + }; + "verror-1.10.0" = { + name = "verror"; + packageName = "verror"; + version = "1.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz"; + sha1 = "3a105ca17053af55d6e270c1f8288682e18da400"; + }; + }; + "wide-align-1.1.3" = { + name = "wide-align"; + packageName = "wide-align"; + version = "1.1.3"; + src = fetchurl { + url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz"; + sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA=="; + }; + }; + "wrappy-1.0.2" = { + name = "wrappy"; + packageName = "wrappy"; + version = "1.0.2"; + src = fetchurl { + url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"; + sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"; + }; + }; + "xtend-4.0.1" = { + name = "xtend"; + packageName = "xtend"; + version = "4.0.1"; + src = fetchurl { + url = "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"; + sha1 = "a5c6d532be656e23db820efb943a1f04998d63af"; + }; + }; + "yallist-3.0.3" = { + name = "yallist"; + packageName = "yallist"; + version = "3.0.3"; + src = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz"; + sha512 = "S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A=="; + }; + }; + "yauzl-2.10.0" = { + name = "yauzl"; + packageName = "yauzl"; + version = "2.10.0"; + src = fetchurl { + url = "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz"; + sha1 = "c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"; + }; + }; + }; +in +{ + "realm-https://github.com/status-im/realm-js/archive/v2.20.1.tar.gz" = nodeEnv.buildNodePackage { + name = "realm"; + packageName = "realm"; + version = "2.20.1"; + src = fetchurl { + name = "realm-2.20.1.tar.gz"; + url = https://codeload.github.com/status-im/realm-js/tar.gz/v2.20.1; + sha256 = "7525a4407c919e64e7b7c21eb810c98b5d00268fe42efe11e2f7eba5936188b4"; + }; + dependencies = [ + sources."abbrev-1.1.1" + sources."ajv-6.10.0" + sources."ansi-regex-2.1.1" + sources."aproba-1.2.0" + sources."are-we-there-yet-1.1.5" + sources."array-back-2.0.0" + sources."asap-2.0.6" + sources."asn1-0.2.4" + sources."assert-plus-1.0.0" + sources."asynckit-0.4.0" + sources."aws-sign2-0.7.0" + sources."aws4-1.8.0" + sources."balanced-match-1.0.0" + sources."base64-js-1.3.0" + sources."bcrypt-pbkdf-1.0.2" + sources."bl-1.2.2" + sources."brace-expansion-1.1.11" + sources."buffer-5.2.1" + sources."buffer-alloc-1.2.0" + sources."buffer-alloc-unsafe-1.1.0" + sources."buffer-crc32-0.2.13" + sources."buffer-fill-1.0.0" + sources."buffer-from-1.1.1" + sources."caseless-0.12.0" + sources."chownr-1.1.1" + sources."code-point-at-1.1.0" + sources."combined-stream-1.0.8" + sources."command-line-args-4.0.7" + sources."commander-2.8.1" + sources."concat-map-0.0.1" + sources."concat-stream-1.6.2" + sources."console-control-strings-1.1.0" + sources."core-util-is-1.0.2" + sources."dashdash-1.14.1" + sources."debug-3.2.6" + sources."decompress-4.2.0" + sources."decompress-tar-4.1.1" + (sources."decompress-tarbz2-4.1.1" // { + dependencies = [ + sources."file-type-6.2.0" + ]; + }) + sources."decompress-targz-4.1.1" + (sources."decompress-unzip-4.0.1" // { + dependencies = [ + sources."file-type-3.9.0" + ]; + }) + sources."deep-extend-0.6.0" + sources."deepmerge-2.1.0" + sources."delayed-stream-1.0.0" + sources."delegates-1.0.0" + sources."detect-libc-1.0.3" + sources."ecc-jsbn-0.1.2" + sources."encoding-0.1.12" + sources."end-of-stream-1.4.1" + sources."extend-3.0.2" + sources."extsprintf-1.3.0" + sources."fast-deep-equal-2.0.1" + sources."fast-json-stable-stringify-2.0.0" + sources."fd-slicer-1.1.0" + sources."file-type-5.2.0" + (sources."find-replace-1.0.3" // { + dependencies = [ + sources."array-back-1.0.4" + ]; + }) + sources."forever-agent-0.6.1" + sources."form-data-2.3.3" + sources."fs-constants-1.0.0" + sources."fs-extra-4.0.3" + sources."fs-minipass-1.2.6" + sources."fs.realpath-1.0.0" + sources."gauge-2.7.4" + sources."get-stream-2.3.1" + sources."getpass-0.1.7" + sources."glob-7.1.4" + sources."graceful-fs-4.1.15" + sources."graceful-readlink-1.0.1" + sources."har-schema-2.0.0" + sources."har-validator-5.1.3" + sources."has-unicode-2.0.1" + (sources."http-basic-2.5.1" // { + dependencies = [ + sources."caseless-0.11.0" + ]; + }) + sources."http-response-object-1.1.0" + sources."http-signature-1.2.0" + sources."iconv-lite-0.4.24" + sources."ieee754-1.1.13" + sources."ignore-walk-3.0.1" + sources."inflight-1.0.6" + sources."inherits-2.0.3" + sources."ini-1.3.5" + sources."is-fullwidth-code-point-1.0.0" + sources."is-natural-number-4.0.1" + sources."is-stream-1.1.0" + sources."is-typedarray-1.0.0" + sources."isarray-1.0.0" + sources."isstream-0.1.2" + sources."js-tokens-4.0.0" + sources."jsbn-0.1.1" + sources."json-schema-0.2.3" + sources."json-schema-traverse-0.4.1" + sources."json-stringify-safe-5.0.1" + sources."jsonfile-4.0.0" + sources."jsprim-1.4.1" + sources."loose-envify-1.4.0" + (sources."make-dir-1.3.0" // { + dependencies = [ + sources."pify-3.0.0" + ]; + }) + sources."mime-db-1.40.0" + sources."mime-types-2.1.24" + sources."minimatch-3.0.4" + sources."minimist-0.0.8" + sources."minipass-2.3.5" + sources."minizlib-1.2.1" + sources."mkdirp-0.5.1" + sources."ms-2.1.1" + sources."nan-2.14.0" + sources."needle-2.4.0" + sources."node-fetch-1.7.3" + sources."node-machine-id-1.1.10" + sources."node-pre-gyp-0.11.0" + sources."nopt-4.0.1" + sources."npm-bundled-1.0.6" + sources."npm-packlist-1.4.1" + sources."npmlog-4.1.2" + sources."number-is-nan-1.0.1" + sources."oauth-sign-0.9.0" + sources."object-assign-4.1.1" + sources."once-1.4.0" + sources."os-homedir-1.0.2" + sources."os-tmpdir-1.0.2" + sources."osenv-0.1.5" + sources."path-is-absolute-1.0.1" + sources."pend-1.2.0" + sources."performance-now-2.1.0" + sources."pify-2.3.0" + sources."pinkie-2.0.4" + sources."pinkie-promise-2.0.1" + sources."process-nextick-args-2.0.0" + sources."progress-2.0.3" + sources."promise-7.3.1" + sources."prop-types-15.7.2" + sources."psl-1.1.31" + sources."punycode-2.1.1" + sources."qs-6.5.2" + sources."querystringify-2.1.1" + (sources."rc-1.2.8" // { + dependencies = [ + sources."minimist-1.2.0" + ]; + }) + sources."react-is-16.8.6" + sources."readable-stream-2.3.6" + sources."request-2.88.0" + sources."requires-port-1.0.0" + sources."rimraf-2.6.3" + sources."safe-buffer-5.1.2" + sources."safer-buffer-2.1.2" + sources."sax-1.2.4" + sources."seek-bzip-1.0.5" + sources."semver-5.7.0" + sources."set-blocking-2.0.0" + sources."signal-exit-3.0.2" + sources."sshpk-1.16.1" + sources."stream-counter-1.0.0" + sources."string-width-1.0.2" + sources."string_decoder-1.1.1" + sources."strip-ansi-3.0.1" + sources."strip-dirs-2.1.0" + sources."strip-json-comments-2.0.1" + sources."sync-request-3.0.1" + sources."tar-4.4.8" + sources."tar-stream-1.6.2" + (sources."test-value-2.1.0" // { + dependencies = [ + sources."array-back-1.0.4" + ]; + }) + (sources."then-request-2.2.0" // { + dependencies = [ + sources."caseless-0.11.0" + ]; + }) + sources."through-2.3.8" + sources."to-buffer-1.1.1" + (sources."tough-cookie-2.4.3" // { + dependencies = [ + sources."punycode-1.4.1" + ]; + }) + sources."tunnel-agent-0.6.0" + sources."tweetnacl-0.14.5" + sources."typedarray-0.0.6" + sources."typical-2.6.1" + sources."unbzip2-stream-1.3.3" + sources."universalify-0.1.2" + sources."uri-js-4.2.2" + sources."url-parse-1.4.7" + sources."util-deprecate-1.0.2" + sources."uuid-3.3.2" + sources."verror-1.10.0" + sources."wide-align-1.1.3" + sources."wrappy-1.0.2" + sources."xtend-4.0.1" + sources."yallist-3.0.3" + sources."yauzl-2.10.0" + ]; + buildInputs = globalBuildInputs; + meta = { + description = "Realm is a mobile database: an alternative to SQLite and key-value stores"; + homepage = https://realm.io/; + license = "See the actual license in the file LICENSE"; + }; + production = true; + bypassCache = true; + reconstructLock = true; + }; +} \ No newline at end of file diff --git a/nix/mobile/default.nix b/nix/mobile/default.nix index 688a01c2fabc..5814d53aa027 100644 --- a/nix/mobile/default.nix +++ b/nix/mobile/default.nix @@ -1,5 +1,5 @@ -{ config, stdenv, callPackage, target-os, - gradle, status-go, composeXcodeWrapper }: +{ config, stdenv, pkgs, callPackage, target-os, + gradle, status-go, composeXcodeWrapper, nodejs }: with stdenv; @@ -13,6 +13,10 @@ let selectedSources = [ status-go ] ++ lib.optional platform.targetAndroid androidPlatform; + nodeInputs = import ./realm-node { + # The remaining dependencies come from Nixpkgs + inherit pkgs nodejs; + }; in { @@ -21,6 +25,7 @@ in buildInputs = status-go.buildInputs ++ + (builtins.attrValues nodeInputs) ++ lib.catAttrs "buildInputs" selectedSources ++ lib.optional (platform.targetIOS && isDarwin) xcodeWrapper; shellHook = lib.concatStrings (lib.catAttrs "shellHook" selectedSources); diff --git a/nix/mobile/realm-node/README.md b/nix/mobile/realm-node/README.md new file mode 100644 index 000000000000..f813f5f4c8fb --- /dev/null +++ b/nix/mobile/realm-node/README.md @@ -0,0 +1,13 @@ +# Abstract + +The purpose of this folder is to allow some tools such as `react-native` to be installed globally through Nix instead of resorting to `npm install -g` (which is not allowed in a Nix environment). We get around that by using the [node2nix tool](https://github.com/svanderburg/node2nix). + +## Inputs + +The inputs are listed in `node-packages.json`. + +## Generating the nix expressions + +``` shell +node2nix --nodejs-10 --bypass-cache -i node-packages.json +``` \ No newline at end of file diff --git a/nix/global-node-packages/default.nix b/nix/mobile/realm-node/default.nix similarity index 77% rename from nix/global-node-packages/default.nix rename to nix/mobile/realm-node/default.nix index 779aec749354..0dd1bbef527c 100644 --- a/nix/global-node-packages/default.nix +++ b/nix/mobile/realm-node/default.nix @@ -2,7 +2,7 @@ let nodePackages = import ./output { inherit pkgs; inherit nodejs; }; realm-version = "5.12.1"; - realm-patched-name = "realm-git+https://github.com/status-im/realm-js.git#heads/v2.20.1"; + realm-patched-name = "realm-https://github.com/realm/realm-js/archive/v2.26.1.tar.gz"; realm-core-src = pkgs.fetchurl ( if builtins.currentSystem == "x86_64-darwin" then { url = "https://static.realm.io/downloads/core/realm-core-Release-v${realm-version}-Darwin-devel.tar.gz"; @@ -13,8 +13,8 @@ let nodePackages = import ./output { inherit pkgs; inherit nodejs; }; } ); realm-dest-dir = if builtins.currentSystem == "x86_64-darwin" then - "$out/lib/node_modules/realm/vendor/realm-darwin-x64" else - "$out/lib/node_modules/realm/vendor/realm-linux-x64"; + "$out/lib/node_modules/realm/compiled/node-v64_darwin_x64/realm.node" else + "$out/lib/node_modules/realm/compiled/node-v64_linux_x64/realm.node"; in nodePackages // { ${realm-patched-name} = nodePackages.${realm-patched-name}.override(oldAttrs: { buildInputs = oldAttrs.buildInputs ++ [ pkgs.nodePackages.node-pre-gyp ]; @@ -22,7 +22,7 @@ in nodePackages // { preRebuild = '' # Do not attempt to do any http calls! substituteInPlace $out/lib/node_modules/realm/scripts/download-realm.js \ - --replace "return acquire(requirements, realmDir)" "" + --replace "!shouldSkipAcquire(realmDir, requirements, options.force)" "false" mkdir -p ${realm-dest-dir} tar -xzf ${realm-core-src} -C ${realm-dest-dir} ''; diff --git a/nix/mobile/realm-node/generate-nix.sh b/nix/mobile/realm-node/generate-nix.sh new file mode 100755 index 000000000000..63c9508d78c0 --- /dev/null +++ b/nix/mobile/realm-node/generate-nix.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +GIT_ROOT=$(git rev-parse --show-toplevel) +SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" +toolversion="${GIT_ROOT}/scripts/toolversion" +dir="$SCRIPTPATH" +input="${dir}/output/node-packages.json" +output_dir="${dir}/output" + +rm -rf $output_dir && mkdir -p $output_dir +cat << EOF > $input +[ + { "realm": "https://github.com/realm/realm-js/archive/v2.26.1.tar.gz" } +] +EOF + +node_required_version=$($toolversion node) +node_major_version=$(echo $node_required_version | cut -d. -f1,1) + +node2nix --nodejs-${node_major_version} --bypass-cache -i $input \ + -o $output_dir/node-packages.nix \ + -c $output_dir/default.nix \ + -e $output_dir/node-env.nix +rm $input diff --git a/nix/mobile/realm-node/output/default.nix b/nix/mobile/realm-node/output/default.nix new file mode 100644 index 000000000000..f2ba5a4d8d74 --- /dev/null +++ b/nix/mobile/realm-node/output/default.nix @@ -0,0 +1,17 @@ +# This file has been generated by node2nix 1.6.1. Do not edit! + +{pkgs ? import { + inherit system; + }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-6_x"}: + +let + nodeEnv = import ./node-env.nix { + inherit (pkgs) stdenv python2 utillinux runCommand writeTextFile; + inherit nodejs; + libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null; + }; +in +import ./node-packages.nix { + inherit (pkgs) fetchurl fetchgit; + inherit nodeEnv; +} \ No newline at end of file diff --git a/nix/mobile/realm-node/output/node-env.nix b/nix/mobile/realm-node/output/node-env.nix new file mode 100644 index 000000000000..175e5104cee7 --- /dev/null +++ b/nix/mobile/realm-node/output/node-env.nix @@ -0,0 +1,531 @@ +# This file originates from node2nix + +{stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}: + +let + 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}: + stdenv.lib.optionalString (dependencies != []) + (stdenv.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: + '' + 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 .. + ${stdenv.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"} + + ${stdenv.lib.optionalString (dependencies != []) + '' + if [ -d node_modules ] + then + cd node_modules + ${stdenv.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 .. + ${stdenv.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. + } + + packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories. + 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(packageLock.lockfileVersion !== 1) { + process.stderr.write("Sorry, I only understand lock file version 1!\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 + + ${stdenv.lib.optionalString bypassCache '' + ${stdenv.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} ${stdenv.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} ${stdenv.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 ] + ++ stdenv.lib.optional (stdenv.isLinux) utillinux + ++ stdenv.lib.optional (stdenv.isDarwin) libtool + ++ buildInputs; + + 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 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 + extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ]; + + nodeDependencies = stdenv.mkDerivation ({ + name = "node-dependencies-${name}-${version}"; + + buildInputs = [ tarWrapper python nodejs ] + ++ stdenv.lib.optional (stdenv.isLinux) utillinux + ++ stdenv.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 + ${stdenv.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 .. + ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} + + ${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }} + + # Expose the executables that were installed + cd .. + ${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."} + + mv ${packageName} lib + ln -s $out/lib/node_modules/.bin $out/bin + ''; + } // extraArgs); + in + stdenv.mkDerivation { + name = "node-shell-${name}-${version}"; + + buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ buildInputs; + buildCommand = '' + mkdir -p $out/bin + cat > $out/bin/shell <