summary refs log tree commit diff
path: root/pkgs/development/mobile
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/mobile')
-rw-r--r--pkgs/development/mobile/androidenv/androidsdk.nix2
-rw-r--r--pkgs/development/mobile/androidenv/build-tools.nix3
-rw-r--r--pkgs/development/mobile/titaniumenv/build-app.nix71
-rw-r--r--pkgs/development/mobile/titaniumenv/cli/cli.json3
-rw-r--r--pkgs/development/mobile/titaniumenv/cli/default.nix15
-rw-r--r--pkgs/development/mobile/titaniumenv/cli/node-env.nix309
-rw-r--r--pkgs/development/mobile/titaniumenv/cli/registry.nix2393
-rw-r--r--pkgs/development/mobile/titaniumenv/default.nix35
-rw-r--r--pkgs/development/mobile/titaniumenv/examples/default.nix6
-rw-r--r--pkgs/development/mobile/titaniumenv/examples/kitchensink/default.nix10
-rw-r--r--pkgs/development/mobile/titaniumenv/fixnativelibs.sed1
-rw-r--r--pkgs/development/mobile/titaniumenv/fixso.sed1
-rw-r--r--pkgs/development/mobile/titaniumenv/fixtiprofiler.sed1
-rw-r--r--pkgs/development/mobile/titaniumenv/fixtiverify.sed1
-rw-r--r--pkgs/development/mobile/titaniumenv/titaniumsdk-3.1.nix80
-rw-r--r--pkgs/development/mobile/titaniumenv/titaniumsdk-3.2.nix77
-rw-r--r--pkgs/development/mobile/titaniumenv/titaniumsdk-3.3.nix77
-rw-r--r--pkgs/development/mobile/titaniumenv/titaniumsdk-3.4.nix77
-rw-r--r--pkgs/development/mobile/titaniumenv/titaniumsdk-3.5.nix77
-rw-r--r--pkgs/development/mobile/titaniumenv/titaniumsdk-5.1.nix42
-rw-r--r--pkgs/development/mobile/xcodeenv/build-app.nix4
-rw-r--r--pkgs/development/mobile/xcodeenv/default.nix2
-rw-r--r--pkgs/development/mobile/xcodeenv/simulate-app.nix2
-rw-r--r--pkgs/development/mobile/xcodeenv/xcodewrapper.nix2
24 files changed, 2822 insertions, 469 deletions
diff --git a/pkgs/development/mobile/androidenv/androidsdk.nix b/pkgs/development/mobile/androidenv/androidsdk.nix
index eb0c4295bcd..aa009cb301a 100644
--- a/pkgs/development/mobile/androidenv/androidsdk.nix
+++ b/pkgs/development/mobile/androidenv/androidsdk.nix
@@ -221,7 +221,7 @@ stdenv.mkDerivation rec {
         fi
     done
 
-    for i in $out/libexec/android-sdk-*/build-tools/android-*/*
+    for i in $out/libexec/android-sdk-*/build-tools/*/*
     do
         if [ ! -d $i ] && [ -x $i ]
         then
diff --git a/pkgs/development/mobile/androidenv/build-tools.nix b/pkgs/development/mobile/androidenv/build-tools.nix
index f429a629f31..1f4bf6e4cfd 100644
--- a/pkgs/development/mobile/androidenv/build-tools.nix
+++ b/pkgs/development/mobile/androidenv/build-tools.nix
@@ -18,10 +18,11 @@ stdenv.mkDerivation rec {
     mkdir -p $out/build-tools
     cd $out/build-tools
     unzip $src
+    mv android-* ${version}
     
     ${stdenv.lib.optionalString (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux")
       ''
-        cd android-*
+        cd ${version}
         
         # Patch the interpreter
         for i in aapt aidl bcc_compat dexdump llvm-rs-cc
diff --git a/pkgs/development/mobile/titaniumenv/build-app.nix b/pkgs/development/mobile/titaniumenv/build-app.nix
index 04691848779..0de6c58e726 100644
--- a/pkgs/development/mobile/titaniumenv/build-app.nix
+++ b/pkgs/development/mobile/titaniumenv/build-app.nix
@@ -1,7 +1,7 @@
 {stdenv, androidsdk, titaniumsdk, titanium, xcodewrapper, jdk, python, which, xcodeBaseDir}:
-{ name, src, target, androidPlatformVersions ? [ "8" ], androidAbiVersions ? [ "armeabi" "armeabi-v7a" ], tiVersion ? null
+{ name, src, target, androidPlatformVersions ? [ "23" ], androidAbiVersions ? [ "armeabi" "armeabi-v7a" ], tiVersion ? null
 , release ? false, androidKeyStore ? null, androidKeyAlias ? null, androidKeyStorePassword ? null
-, iosMobileProvisioningProfile ? null, iosCertificateName ? null, iosCertificate ? null, iosCertificatePassword ? null, iosVersion ? "8.1", iosWwdrCertificate ? null
+, iosMobileProvisioningProfile ? null, iosCertificateName ? null, iosCertificate ? null, iosCertificatePassword ? null, iosVersion ? "9.2"
 , enableWirelessDistribution ? false, installURL ? null
 }:
 
@@ -43,31 +43,29 @@ stdenv.mkDerivation {
     
     echo "{}" > $TMPDIR/config.json
     titanium --config-file $TMPDIR/config.json --no-colors config sdk.defaultInstallLocation ${titaniumsdk}
-    
     titanium --config-file $TMPDIR/config.json --no-colors config paths.modules ${titaniumsdk}
     
     mkdir -p $out
     
     ${if target == "android" then
         ''
-          titanium config --config-file $TMPDIR/config.json --no-colors android.sdkPath ${androidsdkComposition}/libexec/android-sdk-*
+          titanium config --config-file $TMPDIR/config.json --no-colors android.sdk ${androidsdkComposition}/libexec/android-sdk-*
+          titanium config --config-file $TMPDIR/config.json --no-colors android.buildTools.selectedVersion 23.0.1
+          titanium config --config-file $TMPDIR/config.json --no-colors android.buildTools.path ${androidsdkComposition}/libexec/android-sdk-*/build-tools/android-*
+          titanium config --config-file $TMPDIR/config.json android.executables.zipalign ${androidsdkComposition}/libexec/android-sdk-*/build-tools/android-*/zipalign
+          titanium config --config-file $TMPDIR/config.json android.executables.aapt ${androidsdkComposition}/libexec/android-sdk-*/build-tools/android-*/aapt
+          titanium config --config-file $TMPDIR/config.json android.executables.aidl ${androidsdkComposition}/libexec/android-sdk-*/build-tools/android-*/aidl
+          titanium config --config-file $TMPDIR/config.json android.executables.dx ${androidsdkComposition}/libexec/android-sdk-*/build-tools/android-*/dx
           
-          # Add zipalign to PATH to make Ti 3.1 builds still work
-          for i in $(find -L ${androidsdkComposition}/libexec/android-sdk-*/build-tools -name zipalign)
-          do
-              export PATH=$(dirname $i):$PATH
-              break
-          done
+          export PATH=$(echo ${androidsdkComposition}/libexec/android-sdk-*/tools):$(echo ${androidsdkComposition}/libexec/android-sdk-*/build-tools/android-*):$PATH
           
           ${if release then
-            ''titanium build --config-file $TMPDIR/config.json --no-colors --force --platform android --target dist-playstore --keystore ${androidKeyStore} --alias ${androidKeyAlias} --password ${androidKeyStorePassword} --output-dir $out''
+            ''titanium build --config-file $TMPDIR/config.json --no-colors --force --platform android --target dist-playstore --keystore ${androidKeyStore} --alias ${androidKeyAlias} --store-password ${androidKeyStorePassword} --output-dir $out''
           else
             ''titanium build --config-file $TMPDIR/config.json --no-colors --force --platform android --target emulator --build-only -B foo --output $out''}
         ''
       else if target == "iphone" then
         ''
-          export NIX_TITANIUM_WORKAROUND="--config-file $TMPDIR/config.json"
-          
           ${if release then
             ''
               export HOME=/Users/$(whoami)
@@ -78,9 +76,6 @@ stdenv.mkDerivation {
               security default-keychain -s $keychainName
               security unlock-keychain -p "" $keychainName
               security import ${iosCertificate} -k $keychainName -P "${iosCertificatePassword}" -A
-              ${stdenv.lib.optionalString (iosWwdrCertificate != null) ''
-                security import ${iosWwdrCertificate} -k $keychainName
-              ''}
               provisioningId=$(grep UUID -A1 -a ${iosMobileProvisioningProfile} | grep -o "[-A-Za-z0-9]\{36\}")
    
               # Ensure that the requested provisioning profile can be found
@@ -91,16 +86,6 @@ stdenv.mkDerivation {
                   cp ${iosMobileProvisioningProfile} "$HOME/Library/MobileDevice/Provisioning Profiles/$provisioningId.mobileprovision"
               fi
             
-              # Make a copy of the Titanium SDK and fix its permissions. Without it,
-              # builds using the facebook module fail, because it needs to be writable
-            
-              cp -av ${titaniumsdk} $TMPDIR/titaniumsdk
-            
-              find $TMPDIR/titaniumsdk | while read i
-              do
-                  chmod 755 "$i"
-              done
-              
               # Simulate a login
               mkdir -p $HOME/.titanium
               cat > $HOME/.titanium/auth_session.json <<EOF
@@ -110,14 +95,21 @@ stdenv.mkDerivation {
               # Configure the path to Xcode
               titanium --config-file $TMPDIR/config.json --no-colors config paths.xcode ${xcodeBaseDir}
               
-              # Set the SDK to our copy
-              titanium --config-file $TMPDIR/config.json --no-colors config sdk.defaultInstallLocation $TMPDIR/titaniumsdk
-            
+              # Make plutil available
+              mkdir -p $TMPDIR/bin
+              ln -s /usr/bin/plutil $TMPDIR/bin
+              export PATH=$TMPDIR/bin:$PATH
+              
+              # Link the modules folder
+              if [ ! -e modules ]
+              then
+                  ln -s ${titaniumsdk}/modules modules
+              fi
+              
               # Do the actual build
               titanium build --config-file $TMPDIR/config.json --force --no-colors --platform ios --target dist-adhoc --pp-uuid $provisioningId --distribution-name "${iosCertificateName}" --keychain $HOME/Library/Keychains/$keychainName --device-family universal --ios-version ${iosVersion} --output-dir $out
             
               # Remove our generated keychain
-            
               ${deleteKeychain}
             ''
           else
@@ -129,11 +121,28 @@ stdenv.mkDerivation {
             
               cp -av * $out
               cd $out
-            
+              
+              # We need to consult a real home directory to find the available simulators
+              export HOME=/Users/$(whoami)
+              
               # Configure the path to Xcode
               titanium --config-file $TMPDIR/config.json --no-colors config paths.xcode ${xcodeBaseDir}
               
+              # Link the modules folder
+              if [ ! -e modules ]
+              then
+                  ln -s ${titaniumsdk}/modules modules
+                  createdModulesSymlink=1
+              fi
+              
+              # Execute the build
               titanium build --config-file $TMPDIR/config.json --force --no-colors --platform ios --target simulator --build-only --device-family universal --ios-version ${iosVersion} --output-dir $out
+              
+              # Remove the modules symlink
+              if [ "$createdModulesSymlink" = "1" ]
+              then
+                  rm $out/modules
+              fi
           ''}
         ''
 
diff --git a/pkgs/development/mobile/titaniumenv/cli/cli.json b/pkgs/development/mobile/titaniumenv/cli/cli.json
new file mode 100644
index 00000000000..df2c0af5d93
--- /dev/null
+++ b/pkgs/development/mobile/titaniumenv/cli/cli.json
@@ -0,0 +1,3 @@
+[
+  "titanium"
+]
diff --git a/pkgs/development/mobile/titaniumenv/cli/default.nix b/pkgs/development/mobile/titaniumenv/cli/default.nix
new file mode 100644
index 00000000000..fa98bb3b76a
--- /dev/null
+++ b/pkgs/development/mobile/titaniumenv/cli/default.nix
@@ -0,0 +1,15 @@
+{system ? builtins.currentSystem, pkgs ? import <nixpkgs> {
+    inherit system;
+  }, overrides ? {}}:
+
+let
+  nodeEnv = import ./node-env.nix {
+    inherit (pkgs) stdenv fetchurl nodejs python utillinux runCommand;
+  };
+  registry = (import ./registry.nix {
+    inherit (nodeEnv) buildNodePackage;
+    inherit (pkgs) fetchurl fetchgit;
+    self = registry;
+  }) // overrides;
+in
+registry
\ No newline at end of file
diff --git a/pkgs/development/mobile/titaniumenv/cli/node-env.nix b/pkgs/development/mobile/titaniumenv/cli/node-env.nix
new file mode 100644
index 00000000000..7af18c034f2
--- /dev/null
+++ b/pkgs/development/mobile/titaniumenv/cli/node-env.nix
@@ -0,0 +1,309 @@
+{ stdenv, fetchurl, nodejs, python, utillinux, runCommand }:
+
+let
+  # Function that generates a TGZ file from a NPM project
+  buildNodeSourceDist =
+    { name, version, src }:
+    
+    stdenv.mkDerivation {
+      name = "node-tarball-${name}-${version}";
+      inherit src;
+      buildInputs = [ nodejs ];
+      buildPhase = ''
+        export HOME=$TMPDIR
+        tgzFile=$(npm pack)
+      '';
+      installPhase = ''
+        mkdir -p $out/tarballs
+        mv $tgzFile $out/tarballs
+        mkdir -p $out/nix-support
+        echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products
+      '';
+    };
+
+  # We must run semver to determine whether a provided dependency conforms to a certain version range
+  semver = buildNodePackage {
+    name = "semver";
+    version = "5.0.3";
+    src = fetchurl {
+      url = http://registry.npmjs.org/semver/-/semver-5.0.3.tgz;
+      sha1 = "77466de589cd5d3c95f138aa78bc569a3cb5d27a";
+    };
+  } {};
+  
+  # Function that produces a deployed NPM package in the Nix store
+  buildNodePackage =
+    { name, version, src, dependencies ? {}, buildInputs ? [], production ? true, npmFlags ? "", meta ? {}, linkDependencies ? false }:
+    { providedDependencies ? {} }:
+
+    let
+      # Generate and import a Nix expression that determines which dependencies
+      # are required and which are not required (and must be shimmed).
+      #
+      # It uses the semver utility to check whether a version range matches any
+      # of the provided dependencies.
+  
+      analysedDependencies = 
+        if dependencies == {} then {}
+        else
+          import (stdenv.mkDerivation {
+            name = "${name}-${version}-analysedDependencies.nix";
+            buildInputs = [ semver ];
+            buildCommand = ''
+              cat > $out <<EOF
+              {
+              ${stdenv.lib.concatMapStrings (dependencyName:
+                let
+                  dependency = builtins.getAttr dependencyName dependencies;
+                  versionSpecs = builtins.attrNames dependency;
+                in
+                stdenv.lib.concatMapStrings (versionSpec:
+                  if builtins.hasAttr dependencyName providedDependencies # Search for any provided dependencies that match the required version spec. If one matches, the dependency should not be included
+                  then
+                    let
+                      providedDependency = builtins.getAttr dependencyName providedDependencies;
+                      versions = builtins.attrNames providedDependency;
+                      
+                      # If there is a version range match, add the dependency to
+                      # the set of shimmed dependencies.
+                      # Otherwise, it is a required dependency.
+                    in
+                    ''
+                      $(latestVersion=$(semver -r '${versionSpec}' ${stdenv.lib.concatMapStrings (version: " '${version}'") versions} | tail -1 | tr -d '\n')
+                      
+                      if semver -r '${versionSpec}' ${stdenv.lib.concatMapStrings (version: " '${version}'") versions} >/dev/null
+                      then
+                          echo "shimmedDependencies.\"${dependencyName}\".\"$latestVersion\" = true;"
+                      else
+                          echo 'requiredDependencies."${dependencyName}"."${versionSpec}" = true;'
+                      fi)
+                    ''
+                  else # If a dependency is not provided by an includer, we must always include it ourselves
+                    "requiredDependencies.\"${dependencyName}\".\"${versionSpec}\" = true;\n"
+                ) versionSpecs
+              ) (builtins.attrNames dependencies)}
+              }
+              EOF
+            '';
+          });
+    
+      requiredDependencies = analysedDependencies.requiredDependencies or {};
+      shimmedDependencies = analysedDependencies.shimmedDependencies or {};
+
+      # 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
+      '';
+  
+      # Compose dependency information that this package must propagate to its
+      # dependencies, so that provided dependencies are not included a second time.
+      # This prevents cycles and wildcard version mismatches.
+  
+      propagatedProvidedDependencies =
+        (stdenv.lib.mapAttrs (dependencyName: dependency:
+          builtins.listToAttrs (map (versionSpec:
+            { name = dependency."${versionSpec}".version;
+              value = true;
+            }
+          ) (builtins.attrNames dependency))
+        ) dependencies) //
+        providedDependencies //
+        { "${name}"."${version}" = true; };
+        
+      # Create a node_modules folder containing all required dependencies of the
+      # package
+      
+      nodeDependencies = stdenv.mkDerivation {
+        name = "node-dependencies-${name}-${version}";
+        inherit src;
+        buildCommand = ''
+          mkdir -p $out/lib/node_modules
+          cd $out/lib/node_modules
+          
+          # Create copies of (or symlinks to) the dependencies that must be deployed in this package's private node_modules folder.
+          # This package's private dependencies are NPM packages that have not been provided by any of the includers.
+          
+          ${stdenv.lib.concatMapStrings (requiredDependencyName:
+            stdenv.lib.concatMapStrings (versionSpec:
+              let
+                dependency = dependencies."${requiredDependencyName}"."${versionSpec}".pkg {
+                  providedDependencies = propagatedProvidedDependencies;
+                };
+              in
+              ''
+                depPath=$(echo ${dependency}/lib/node_modules/*)
+                
+                ${if linkDependencies then ''
+                  ln -s $depPath .
+                '' else ''
+                  cp -r $depPath .
+                ''}
+              ''
+            ) (builtins.attrNames (requiredDependencies."${requiredDependencyName}"))
+          ) (builtins.attrNames requiredDependencies)}
+        '';
+      };
+    
+      # Deploy the Node package with some tricks
+      self = stdenv.lib.makeOverridable stdenv.mkDerivation {
+        inherit src meta;
+        dontStrip = true;
+      
+        name = "node-${name}-${version}";
+        buildInputs = [ nodejs python ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
+        buildPhase = "true";
+    
+        installPhase = ''
+          # Move the contents of the tarball into the output folder
+          mkdir -p "$out/lib/node_modules/${name}"
+          mv * "$out/lib/node_modules/${name}"
+          
+          # Enter the target directory
+          cd "$out/lib/node_modules/${name}"
+          
+          # Patch the shebangs of the bundled modules. For "regular" dependencies
+          # this is step is not required, because it has already been done by the generic builder.
+          
+          if [ -d node_modules ]
+          then
+              patchShebangs node_modules
+          fi
+          
+          # Copy the required dependencies
+          mkdir -p node_modules
+          
+          ${stdenv.lib.optionalString (requiredDependencies != {}) ''
+            for i in ${nodeDependencies}/lib/node_modules/*
+            do
+                if [ ! -d "node_modules/$(basename $i)" ]
+                then
+                    cp -a $i node_modules
+                fi
+            done
+          ''}
+          
+          # Create shims for the packages that have been provided by earlier includers to allow the NPM install operation to still succeed
+          
+          ${stdenv.lib.concatMapStrings (shimmedDependencyName:
+            stdenv.lib.concatMapStrings (versionSpec:
+              ''
+                mkdir -p node_modules/${shimmedDependencyName}
+                cat > node_modules/${shimmedDependencyName}/package.json <<EOF
+                {
+                    "name": "${shimmedDependencyName}",
+                    "version": "${versionSpec}"
+                }
+                EOF
+              ''
+            ) (builtins.attrNames (shimmedDependencies."${shimmedDependencyName}"))
+          ) (builtins.attrNames shimmedDependencies)}
+          
+          # Ignore npm-shrinkwrap.json for now. Ideally, it should be supported as well
+          rm -f npm-shrinkwrap.json
+          
+          # Some version specifiers (latest, unstable, URLs, file paths) force NPM to make remote connections or consult paths outside the Nix store.
+          # The following JavaScript replaces these by * to prevent that:
+          
+          (
+          cat <<EOF
+          var fs = require('fs');
+          var url = require('url');
+          
+          /*
+           * Replaces an impure version specification by *
+           */
+          function replaceImpureVersionSpec(versionSpec) {
+              var parsedUrl = url.parse(versionSpec);
+              
+              if(versionSpec == "latest" || versionSpec == "unstable" ||
+                  versionSpec.substr(0, 2) == ".." || dependency.substr(0, 2) == "./" || dependency.substr(0, 2) == "~/" || dependency.substr(0, 1) == '/')
+                  return '*';
+              else if(parsedUrl.protocol == "git:" || parsedUrl.protocol == "git+ssh:" || parsedUrl.protocol == "git+http:" || parsedUrl.protocol == "git+https:" ||
+                  parsedUrl.protocol == "http:" || parsedUrl.protocol == "https:")
+                  return '*';
+              else
+                  return versionSpec;
+          }
+          
+          var packageObj = JSON.parse(fs.readFileSync('./package.json'));
+          
+          /* Replace dependencies */
+          if(packageObj.dependencies !== undefined) {
+              for(var dependency in packageObj.dependencies) {
+                  var versionSpec = packageObj.dependencies[dependency];
+                  packageObj.dependencies[dependency] = replaceImpureVersionSpec(versionSpec);
+              }
+          }
+          
+          /* Replace development dependencies */
+          if(packageObj.devDependencies !== undefined) {
+              for(var dependency in packageObj.devDependencies) {
+                  var versionSpec = packageObj.devDependencies[dependency];
+                  packageObj.devDependencies[dependency] = replaceImpureVersionSpec(versionSpec);
+              }
+          }
+          
+          /* Replace optional dependencies */
+          if(packageObj.optionalDependencies !== undefined) {
+              for(var dependency in packageObj.optionalDependencies) {
+                  var versionSpec = packageObj.optionalDependencies[dependency];
+                  packageObj.optionalDependencies[dependency] = replaceImpureVersionSpec(versionSpec);
+              }
+          }
+          
+          /* Write the fixed JSON file */
+          fs.writeFileSync("package.json", JSON.stringify(packageObj));
+          EOF
+          ) | node
+          
+          # Deploy the Node.js package by running npm install. Since the dependencies have been symlinked, 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.
+          
+          export HOME=$TMPDIR
+          npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
+          
+          # After deployment of the NPM package, we must remove the shims again
+          ${stdenv.lib.concatMapStrings (shimmedDependencyName:
+            ''
+              rm node_modules/${shimmedDependencyName}/package.json
+              rmdir node_modules/${shimmedDependencyName}
+            ''
+          ) (builtins.attrNames shimmedDependencies)}
+          
+          # It makes no sense to keep an empty node_modules folder around, so delete it if this is the case
+          if [ -d node_modules ]
+          then
+              rmdir --ignore-fail-on-non-empty node_modules
+          fi
+          
+          # 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/${name}/man" ]
+          then
+              mkdir -p $out/share
+              for dir in "$out/lib/node_modules/${name}/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
+        '';
+        
+        shellHook = stdenv.lib.optionalString (requiredDependencies != {}) ''
+          export NODE_PATH=${nodeDependencies}/lib/node_modules
+        '';
+      };
+    in
+    self;
+in
+{ inherit buildNodeSourceDist buildNodePackage; }
diff --git a/pkgs/development/mobile/titaniumenv/cli/registry.nix b/pkgs/development/mobile/titaniumenv/cli/registry.nix
new file mode 100644
index 00000000000..b5bb23a836c
--- /dev/null
+++ b/pkgs/development/mobile/titaniumenv/cli/registry.nix
@@ -0,0 +1,2393 @@
+{buildNodePackage, fetchurl, fetchgit, self}:
+
+let
+  registry = {
+    "titanium-5.0.5" = buildNodePackage {
+      name = "titanium";
+      version = "5.0.5";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/titanium/-/titanium-5.0.5.tgz";
+        sha1 = "38a466deaeee9a8b346973d70a8baaeb4c3af281";
+      };
+      dependencies = {
+        async = {
+          "1.4.2" = {
+            version = "1.4.2";
+            pkg = self."async-1.4.2";
+          };
+        };
+        colors = {
+          "1.1.2" = {
+            version = "1.1.2";
+            pkg = self."colors-1.1.2";
+          };
+        };
+        fields = {
+          "0.1.24" = {
+            version = "0.1.24";
+            pkg = self."fields-0.1.24";
+          };
+        };
+        humanize = {
+          "0.0.9" = {
+            version = "0.0.9";
+            pkg = self."humanize-0.0.9";
+          };
+        };
+        longjohn = {
+          "0.2.9" = {
+            version = "0.2.9";
+            pkg = self."longjohn-0.2.9";
+          };
+        };
+        moment = {
+          "2.10.6" = {
+            version = "2.10.6";
+            pkg = self."moment-2.10.6";
+          };
+        };
+        node-appc = {
+          "0.2.31" = {
+            version = "0.2.31";
+            pkg = self."node-appc-0.2.31";
+          };
+        };
+        request = {
+          "2.62.0" = {
+            version = "2.62.0";
+            pkg = self."request-2.62.0";
+          };
+        };
+        semver = {
+          "5.0.3" = {
+            version = "5.0.3";
+            pkg = self."semver-5.0.3";
+          };
+        };
+        sprintf = {
+          "0.1.5" = {
+            version = "0.1.5";
+            pkg = self."sprintf-0.1.5";
+          };
+        };
+        temp = {
+          "0.8.3" = {
+            version = "0.8.3";
+            pkg = self."temp-0.8.3";
+          };
+        };
+        winston = {
+          "1.0.x" = {
+            version = "1.0.2";
+            pkg = self."winston-1.0.2";
+          };
+        };
+        wrench = {
+          "1.5.8" = {
+            version = "1.5.8";
+            pkg = self."wrench-1.5.8";
+          };
+        };
+      };
+      meta = {
+        description = "Appcelerator Titanium Command line";
+        homepage = "https://github.com/appcelerator/titanium#readme";
+        license = "Apache-2.0";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "async-1.4.2" = buildNodePackage {
+      name = "async";
+      version = "1.4.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/async/-/async-1.4.2.tgz";
+        sha1 = "6c9edcb11ced4f0dd2f2d40db0d49a109c088aab";
+      };
+      meta = {
+        description = "Higher-order functions and common patterns for asynchronous code";
+        homepage = "https://github.com/caolan/async#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "colors-1.1.2" = buildNodePackage {
+      name = "colors";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz";
+        sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63";
+      };
+      meta = {
+        description = "get colors in your node.js console";
+        homepage = https://github.com/Marak/colors.js;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "fields-0.1.24" = buildNodePackage {
+      name = "fields";
+      version = "0.1.24";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/fields/-/fields-0.1.24.tgz";
+        sha1 = "bed93b1c2521f4705fe764f4209267fdfd89f5d3";
+      };
+      dependencies = {
+        colors = {
+          "~0.6.2" = {
+            version = "0.6.2";
+            pkg = self."colors-0.6.2";
+          };
+        };
+        keypress = {
+          "~0.2.1" = {
+            version = "0.2.1";
+            pkg = self."keypress-0.2.1";
+          };
+        };
+        sprintf = {
+          "~0.1.4" = {
+            version = "0.1.5";
+            pkg = self."sprintf-0.1.5";
+          };
+        };
+      };
+      meta = {
+        description = "Creates fields to prompt for input at the command line";
+        homepage = https://github.com/cb1kenobi/fields;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "colors-0.6.2" = buildNodePackage {
+      name = "colors";
+      version = "0.6.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz";
+        sha1 = "2423fe6678ac0c5dae8852e5d0e5be08c997abcc";
+      };
+      meta = {
+        description = "get colors in your node.js console like what";
+        homepage = https://github.com/Marak/colors.js;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "colors-~0.6.2" = self."colors-0.6.2";
+    "keypress-0.2.1" = buildNodePackage {
+      name = "keypress";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz";
+        sha1 = "1e80454250018dbad4c3fe94497d6e67b6269c77";
+      };
+      meta = {
+        description = "Make any Node ReadableStream emit \"keypress\" events";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "keypress-~0.2.1" = self."keypress-0.2.1";
+    "sprintf-0.1.5" = buildNodePackage {
+      name = "sprintf";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz";
+        sha1 = "8f83e39a9317c1a502cb7db8050e51c679f6edcf";
+      };
+      meta = {
+        description = "Sprintf() for node.js";
+        homepage = https://github.com/maritz/node-sprintf;
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "sprintf-~0.1.4" = self."sprintf-0.1.5";
+    "humanize-0.0.9" = buildNodePackage {
+      name = "humanize";
+      version = "0.0.9";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz";
+        sha1 = "1994ffaecdfe9c441ed2bdac7452b7bb4c9e41a4";
+      };
+      dependencies = {};
+      meta = {
+        description = "Javascript string formatter for human readability";
+        homepage = https://github.com/taijinlee/humanize;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "longjohn-0.2.9" = buildNodePackage {
+      name = "longjohn";
+      version = "0.2.9";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/longjohn/-/longjohn-0.2.9.tgz";
+        sha1 = "db1bf175fcfffcfce099132d1470f52f41a31519";
+      };
+      dependencies = {
+        source-map-support = {
+          "0.3.2" = {
+            version = "0.3.2";
+            pkg = self."source-map-support-0.3.2";
+          };
+        };
+      };
+      meta = {
+        description = "Long stack traces for node.js inspired by https://github.com/tlrobinson/long-stack-traces";
+        homepage = https://github.com/mattinsler/longjohn;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "source-map-support-0.3.2" = buildNodePackage {
+      name = "source-map-support";
+      version = "0.3.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/source-map-support/-/source-map-support-0.3.2.tgz";
+        sha1 = "737d5c901e0b78fdb53aca713d24f23ccbb10be1";
+      };
+      dependencies = {
+        source-map = {
+          "0.1.32" = {
+            version = "0.1.32";
+            pkg = self."source-map-0.1.32";
+          };
+        };
+      };
+      meta = {
+        description = "Fixes stack traces for files with source maps";
+        homepage = https://github.com/evanw/node-source-map-support;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "source-map-0.1.32" = buildNodePackage {
+      name = "source-map";
+      version = "0.1.32";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz";
+        sha1 = "c8b6c167797ba4740a8ea33252162ff08591b266";
+      };
+      dependencies = {
+        amdefine = {
+          ">=0.0.4" = {
+            version = "1.0.0";
+            pkg = self."amdefine-1.0.0";
+          };
+        };
+      };
+      meta = {
+        description = "Generates and consumes source maps";
+        homepage = https://github.com/mozilla/source-map;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "amdefine-1.0.0" = buildNodePackage {
+      name = "amdefine";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz";
+        sha1 = "fd17474700cb5cc9c2b709f0be9d23ce3c198c33";
+      };
+      meta = {
+        description = "Provide AMD's define() API for declaring modules in the AMD format";
+        homepage = http://github.com/jrburke/amdefine;
+        license = "BSD-3-Clause AND MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "amdefine->=0.0.4" = self."amdefine-1.0.0";
+    "moment-2.10.6" = buildNodePackage {
+      name = "moment";
+      version = "2.10.6";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/moment/-/moment-2.10.6.tgz";
+        sha1 = "6cb21967c79cba7b0ca5e66644f173662b3efa77";
+      };
+      meta = {
+        description = "Parse, validate, manipulate, and display dates";
+        homepage = http://momentjs.com/;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "node-appc-0.2.31" = buildNodePackage {
+      name = "node-appc";
+      version = "0.2.31";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/node-appc/-/node-appc-0.2.31.tgz";
+        sha1 = "8d8d0052fd8b8ce4bc44f06883009f7c950bc8c2";
+      };
+      dependencies = {
+        adm-zip = {
+          "0.4.7" = {
+            version = "0.4.7";
+            pkg = self."adm-zip-0.4.7";
+          };
+        };
+        async = {
+          "1.4.2" = {
+            version = "1.4.2";
+            pkg = self."async-1.4.2";
+          };
+        };
+        colors = {
+          "1.1.2" = {
+            version = "1.1.2";
+            pkg = self."colors-1.1.2";
+          };
+        };
+        diff = {
+          "2.1.0" = {
+            version = "2.1.0";
+            pkg = self."diff-2.1.0";
+          };
+        };
+        node-uuid = {
+          "1.4.3" = {
+            version = "1.4.3";
+            pkg = self."node-uuid-1.4.3";
+          };
+        };
+        optimist = {
+          "0.6.1" = {
+            version = "0.6.1";
+            pkg = self."optimist-0.6.1";
+          };
+        };
+        request = {
+          "2.61.0" = {
+            version = "2.61.0";
+            pkg = self."request-2.61.0";
+          };
+        };
+        semver = {
+          "5.0.1" = {
+            version = "5.0.1";
+            pkg = self."semver-5.0.1";
+          };
+        };
+        sprintf = {
+          "0.1.5" = {
+            version = "0.1.5";
+            pkg = self."sprintf-0.1.5";
+          };
+        };
+        temp = {
+          "0.8.3" = {
+            version = "0.8.3";
+            pkg = self."temp-0.8.3";
+          };
+        };
+        wrench = {
+          "1.5.8" = {
+            version = "1.5.8";
+            pkg = self."wrench-1.5.8";
+          };
+        };
+        uglify-js = {
+          "2.4.24" = {
+            version = "2.4.24";
+            pkg = self."uglify-js-2.4.24";
+          };
+        };
+        xmldom = {
+          "0.1.19" = {
+            version = "0.1.19";
+            pkg = self."xmldom-0.1.19";
+          };
+        };
+      };
+      meta = {
+        description = "Appcelerator Common Node Library";
+        homepage = http://github.com/appcelerator/node-appc;
+        license = "Apache Public License v2";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "adm-zip-0.4.7" = buildNodePackage {
+      name = "adm-zip";
+      version = "0.4.7";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz";
+        sha1 = "8606c2cbf1c426ce8c8ec00174447fd49b6eafc1";
+      };
+      meta = {
+        description = "A Javascript implementation of zip for nodejs. Allows user to create or extract zip files both in memory or to/from disk";
+        homepage = http://github.com/cthackers/adm-zip;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "diff-2.1.0" = buildNodePackage {
+      name = "diff";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/diff/-/diff-2.1.0.tgz";
+        sha1 = "39b5aa97f0d1600b428ad0a91dc8efcc9b29e288";
+      };
+      dependencies = {};
+      meta = {
+        description = "A javascript text diff implementation.";
+        homepage = "https://github.com/kpdecker/jsdiff#readme";
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "node-uuid-1.4.3" = buildNodePackage {
+      name = "node-uuid";
+      version = "1.4.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz";
+        sha1 = "319bb7a56e7cb63f00b5c0cd7851cd4b4ddf1df9";
+      };
+      meta = {
+        description = "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.";
+        homepage = https://github.com/broofa/node-uuid;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "optimist-0.6.1" = buildNodePackage {
+      name = "optimist";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz";
+        sha1 = "da3ea74686fa21a19a111c326e90eb15a0196686";
+      };
+      dependencies = {
+        wordwrap = {
+          "~0.0.2" = {
+            version = "0.0.3";
+            pkg = self."wordwrap-0.0.3";
+          };
+        };
+        minimist = {
+          "~0.0.1" = {
+            version = "0.0.10";
+            pkg = self."minimist-0.0.10";
+          };
+        };
+      };
+      meta = {
+        description = "Light-weight option parsing with an argv hash. No optstrings attached.";
+        homepage = https://github.com/substack/node-optimist;
+        license = "MIT/X11";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "wordwrap-0.0.3" = buildNodePackage {
+      name = "wordwrap";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz";
+        sha1 = "a3d5da6cd5c0bc0008d37234bbaf1bed63059107";
+      };
+      meta = {
+        description = "Wrap those words. Show them at what columns to start and stop.";
+        homepage = "https://github.com/substack/node-wordwrap#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "wordwrap-~0.0.2" = self."wordwrap-0.0.3";
+    "minimist-0.0.10" = buildNodePackage {
+      name = "minimist";
+      version = "0.0.10";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz";
+        sha1 = "de3f98543dbf96082be48ad1a0c7cda836301dcf";
+      };
+      meta = {
+        description = "parse argument options";
+        homepage = https://github.com/substack/minimist;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "minimist-~0.0.1" = self."minimist-0.0.10";
+    "request-2.61.0" = buildNodePackage {
+      name = "request";
+      version = "2.61.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/request/-/request-2.61.0.tgz";
+        sha1 = "6973cb2ac94885f02693f554eec64481d6013f9f";
+      };
+      dependencies = {
+        bl = {
+          "~1.0.0" = {
+            version = "1.0.0";
+            pkg = self."bl-1.0.0";
+          };
+        };
+        caseless = {
+          "~0.11.0" = {
+            version = "0.11.0";
+            pkg = self."caseless-0.11.0";
+          };
+        };
+        extend = {
+          "~3.0.0" = {
+            version = "3.0.0";
+            pkg = self."extend-3.0.0";
+          };
+        };
+        forever-agent = {
+          "~0.6.0" = {
+            version = "0.6.1";
+            pkg = self."forever-agent-0.6.1";
+          };
+        };
+        form-data = {
+          "~1.0.0-rc1" = {
+            version = "1.0.0-rc3";
+            pkg = self."form-data-1.0.0-rc3";
+          };
+        };
+        json-stringify-safe = {
+          "~5.0.0" = {
+            version = "5.0.1";
+            pkg = self."json-stringify-safe-5.0.1";
+          };
+        };
+        mime-types = {
+          "~2.1.2" = {
+            version = "2.1.8";
+            pkg = self."mime-types-2.1.8";
+          };
+        };
+        node-uuid = {
+          "~1.4.0" = {
+            version = "1.4.7";
+            pkg = self."node-uuid-1.4.7";
+          };
+        };
+        qs = {
+          "~4.0.0" = {
+            version = "4.0.0";
+            pkg = self."qs-4.0.0";
+          };
+        };
+        tunnel-agent = {
+          "~0.4.0" = {
+            version = "0.4.2";
+            pkg = self."tunnel-agent-0.4.2";
+          };
+        };
+        tough-cookie = {
+          ">=0.12.0" = {
+            version = "2.2.1";
+            pkg = self."tough-cookie-2.2.1";
+          };
+        };
+        http-signature = {
+          "~0.11.0" = {
+            version = "0.11.0";
+            pkg = self."http-signature-0.11.0";
+          };
+        };
+        oauth-sign = {
+          "~0.8.0" = {
+            version = "0.8.0";
+            pkg = self."oauth-sign-0.8.0";
+          };
+        };
+        hawk = {
+          "~3.1.0" = {
+            version = "3.1.2";
+            pkg = self."hawk-3.1.2";
+          };
+        };
+        aws-sign2 = {
+          "~0.5.0" = {
+            version = "0.5.0";
+            pkg = self."aws-sign2-0.5.0";
+          };
+        };
+        stringstream = {
+          "~0.0.4" = {
+            version = "0.0.5";
+            pkg = self."stringstream-0.0.5";
+          };
+        };
+        combined-stream = {
+          "~1.0.1" = {
+            version = "1.0.5";
+            pkg = self."combined-stream-1.0.5";
+          };
+        };
+        isstream = {
+          "~0.1.1" = {
+            version = "0.1.2";
+            pkg = self."isstream-0.1.2";
+          };
+        };
+        har-validator = {
+          "^1.6.1" = {
+            version = "1.8.0";
+            pkg = self."har-validator-1.8.0";
+          };
+        };
+      };
+      meta = {
+        description = "Simplified HTTP request client.";
+        homepage = "https://github.com/request/request#readme";
+        license = "Apache-2.0";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "bl-1.0.0" = buildNodePackage {
+      name = "bl";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/bl/-/bl-1.0.0.tgz";
+        sha1 = "ada9a8a89a6d7ac60862f7dec7db207873e0c3f5";
+      };
+      dependencies = {
+        readable-stream = {
+          "~2.0.0" = {
+            version = "2.0.5";
+            pkg = self."readable-stream-2.0.5";
+          };
+        };
+      };
+      meta = {
+        description = "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!";
+        homepage = https://github.com/rvagg/bl;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "readable-stream-2.0.5" = buildNodePackage {
+      name = "readable-stream";
+      version = "2.0.5";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz";
+        sha1 = "a2426f8dcd4551c77a33f96edf2886a23c829669";
+      };
+      dependencies = {
+        core-util-is = {
+          "~1.0.0" = {
+            version = "1.0.2";
+            pkg = self."core-util-is-1.0.2";
+          };
+        };
+        inherits = {
+          "~2.0.1" = {
+            version = "2.0.1";
+            pkg = self."inherits-2.0.1";
+          };
+        };
+        isarray = {
+          "0.0.1" = {
+            version = "0.0.1";
+            pkg = self."isarray-0.0.1";
+          };
+        };
+        process-nextick-args = {
+          "~1.0.6" = {
+            version = "1.0.6";
+            pkg = self."process-nextick-args-1.0.6";
+          };
+        };
+        string_decoder = {
+          "~0.10.x" = {
+            version = "0.10.31";
+            pkg = self."string_decoder-0.10.31";
+          };
+        };
+        util-deprecate = {
+          "~1.0.1" = {
+            version = "1.0.2";
+            pkg = self."util-deprecate-1.0.2";
+          };
+        };
+      };
+      meta = {
+        description = "Streams3, a user-land copy of the stream library from iojs v2.x";
+        homepage = "https://github.com/nodejs/readable-stream#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "core-util-is-1.0.2" = buildNodePackage {
+      name = "core-util-is";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+        sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
+      };
+      meta = {
+        description = "The `util.is*` functions introduced in Node v0.12.";
+        homepage = "https://github.com/isaacs/core-util-is#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "core-util-is-~1.0.0" = self."core-util-is-1.0.2";
+    "inherits-2.0.1" = buildNodePackage {
+      name = "inherits";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz";
+        sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
+      };
+      meta = {
+        description = "Browser-friendly inheritance fully compatible with standard node.js inherits()";
+        license = "ISC";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "inherits-~2.0.1" = self."inherits-2.0.1";
+    "isarray-0.0.1" = buildNodePackage {
+      name = "isarray";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz";
+        sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
+      };
+      dependencies = {};
+      meta = {
+        description = "Array#isArray for older browsers";
+        homepage = https://github.com/juliangruber/isarray;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "process-nextick-args-1.0.6" = buildNodePackage {
+      name = "process-nextick-args";
+      version = "1.0.6";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz";
+        sha1 = "0f96b001cea90b12592ce566edb97ec11e69bd05";
+      };
+      meta = {
+        description = "process.nextTick but always with args";
+        homepage = https://github.com/calvinmetcalf/process-nextick-args;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "process-nextick-args-~1.0.6" = self."process-nextick-args-1.0.6";
+    "string_decoder-0.10.31" = buildNodePackage {
+      name = "string_decoder";
+      version = "0.10.31";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
+        sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
+      };
+      dependencies = {};
+      meta = {
+        description = "The string_decoder module from Node core";
+        homepage = https://github.com/rvagg/string_decoder;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "string_decoder-~0.10.x" = self."string_decoder-0.10.31";
+    "util-deprecate-1.0.2" = buildNodePackage {
+      name = "util-deprecate";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
+      };
+      meta = {
+        description = "The Node.js `util.deprecate()` function with browser support";
+        homepage = https://github.com/TooTallNate/util-deprecate;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "util-deprecate-~1.0.1" = self."util-deprecate-1.0.2";
+    "readable-stream-~2.0.0" = self."readable-stream-2.0.5";
+    "bl-~1.0.0" = self."bl-1.0.0";
+    "caseless-0.11.0" = buildNodePackage {
+      name = "caseless";
+      version = "0.11.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz";
+        sha1 = "715b96ea9841593cc33067923f5ec60ebda4f7d7";
+      };
+      meta = {
+        description = "Caseless object set/get/has, very useful when working with HTTP headers.";
+        homepage = "https://github.com/mikeal/caseless#readme";
+        license = "Apache-2.0";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "caseless-~0.11.0" = self."caseless-0.11.0";
+    "extend-3.0.0" = buildNodePackage {
+      name = "extend";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/extend/-/extend-3.0.0.tgz";
+        sha1 = "5a474353b9f3353ddd8176dfd37b91c83a46f1d4";
+      };
+      dependencies = {};
+      meta = {
+        description = "Port of jQuery.extend for node.js and the browser";
+        homepage = "https://github.com/justmoon/node-extend#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "extend-~3.0.0" = self."extend-3.0.0";
+    "forever-agent-0.6.1" = buildNodePackage {
+      name = "forever-agent";
+      version = "0.6.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
+        sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
+      };
+      dependencies = {};
+      meta = {
+        description = "HTTP Agent that keeps socket connections alive between keep-alive requests. Formerly part of mikeal/request, now a standalone module.";
+        homepage = https://github.com/mikeal/forever-agent;
+        license = "Apache-2.0";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "forever-agent-~0.6.0" = self."forever-agent-0.6.1";
+    "form-data-1.0.0-rc3" = buildNodePackage {
+      name = "form-data";
+      version = "1.0.0-rc3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz";
+        sha1 = "d35bc62e7fbc2937ae78f948aaa0d38d90607577";
+      };
+      dependencies = {
+        async = {
+          "^1.4.0" = {
+            version = "1.5.1";
+            pkg = self."async-1.5.1";
+          };
+        };
+        combined-stream = {
+          "^1.0.5" = {
+            version = "1.0.5";
+            pkg = self."combined-stream-1.0.5";
+          };
+        };
+        mime-types = {
+          "^2.1.3" = {
+            version = "2.1.8";
+            pkg = self."mime-types-2.1.8";
+          };
+        };
+      };
+      meta = {
+        description = "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.";
+        homepage = "https://github.com/form-data/form-data#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "async-1.5.1" = buildNodePackage {
+      name = "async";
+      version = "1.5.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/async/-/async-1.5.1.tgz";
+        sha1 = "b05714f4b11b357bf79adaffdd06da42d0766c10";
+      };
+      meta = {
+        description = "Higher-order functions and common patterns for asynchronous code";
+        homepage = "https://github.com/caolan/async#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "async-^1.4.0" = self."async-1.5.1";
+    "combined-stream-1.0.5" = buildNodePackage {
+      name = "combined-stream";
+      version = "1.0.5";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz";
+        sha1 = "938370a57b4a51dea2c77c15d5c5fdf895164009";
+      };
+      dependencies = {
+        delayed-stream = {
+          "~1.0.0" = {
+            version = "1.0.0";
+            pkg = self."delayed-stream-1.0.0";
+          };
+        };
+      };
+      meta = {
+        description = "A stream that emits multiple other streams one after another.";
+        homepage = https://github.com/felixge/node-combined-stream;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "delayed-stream-1.0.0" = buildNodePackage {
+      name = "delayed-stream";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
+        sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
+      };
+      dependencies = {};
+      meta = {
+        description = "Buffers events from a stream until you are ready to handle them.";
+        homepage = https://github.com/felixge/node-delayed-stream;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "delayed-stream-~1.0.0" = self."delayed-stream-1.0.0";
+    "combined-stream-^1.0.5" = self."combined-stream-1.0.5";
+    "mime-types-2.1.8" = buildNodePackage {
+      name = "mime-types";
+      version = "2.1.8";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/mime-types/-/mime-types-2.1.8.tgz";
+        sha1 = "faf57823de04bc7cbff4ee82c6b63946e812ae72";
+      };
+      dependencies = {
+        mime-db = {
+          "~1.20.0" = {
+            version = "1.20.0";
+            pkg = self."mime-db-1.20.0";
+          };
+        };
+      };
+      meta = {
+        description = "The ultimate javascript content-type utility.";
+        homepage = https://github.com/jshttp/mime-types;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "mime-db-1.20.0" = buildNodePackage {
+      name = "mime-db";
+      version = "1.20.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/mime-db/-/mime-db-1.20.0.tgz";
+        sha1 = "496f90fd01fe0e031c8823ec3aa9450ffda18ed8";
+      };
+      meta = {
+        description = "Media Type Database";
+        homepage = https://github.com/jshttp/mime-db;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "mime-db-~1.20.0" = self."mime-db-1.20.0";
+    "mime-types-^2.1.3" = self."mime-types-2.1.8";
+    "form-data-~1.0.0-rc1" = self."form-data-1.0.0-rc3";
+    "json-stringify-safe-5.0.1" = buildNodePackage {
+      name = "json-stringify-safe";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
+        sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
+      };
+      meta = {
+        description = "Like JSON.stringify, but doesn't blow up on circular refs.";
+        homepage = https://github.com/isaacs/json-stringify-safe;
+        license = "ISC";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "json-stringify-safe-~5.0.0" = self."json-stringify-safe-5.0.1";
+    "mime-types-~2.1.2" = self."mime-types-2.1.8";
+    "node-uuid-1.4.7" = buildNodePackage {
+      name = "node-uuid";
+      version = "1.4.7";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz";
+        sha1 = "6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f";
+      };
+      dependencies = {};
+      meta = {
+        description = "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.";
+        homepage = https://github.com/broofa/node-uuid;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "node-uuid-~1.4.0" = self."node-uuid-1.4.7";
+    "qs-4.0.0" = buildNodePackage {
+      name = "qs";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/qs/-/qs-4.0.0.tgz";
+        sha1 = "c31d9b74ec27df75e543a86c78728ed8d4623607";
+      };
+      dependencies = {};
+      meta = {
+        description = "A querystring parser that supports nesting and arrays, with a depth limit";
+        homepage = https://github.com/hapijs/qs;
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "qs-~4.0.0" = self."qs-4.0.0";
+    "tunnel-agent-0.4.2" = buildNodePackage {
+      name = "tunnel-agent";
+      version = "0.4.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz";
+        sha1 = "1104e3f36ac87125c287270067d582d18133bfee";
+      };
+      dependencies = {};
+      meta = {
+        description = "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.";
+        homepage = "https://github.com/mikeal/tunnel-agent#readme";
+        license = "Apache-2.0";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "tunnel-agent-~0.4.0" = self."tunnel-agent-0.4.2";
+    "tough-cookie-2.2.1" = buildNodePackage {
+      name = "tough-cookie";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz";
+        sha1 = "3b0516b799e70e8164436a1446e7e5877fda118e";
+      };
+      meta = {
+        description = "RFC6265 Cookies and Cookie Jar for node.js";
+        homepage = https://github.com/SalesforceEng/tough-cookie;
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "tough-cookie->=0.12.0" = self."tough-cookie-2.2.1";
+    "http-signature-0.11.0" = buildNodePackage {
+      name = "http-signature";
+      version = "0.11.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz";
+        sha1 = "1796cf67a001ad5cd6849dca0991485f09089fe6";
+      };
+      dependencies = {
+        assert-plus = {
+          "^0.1.5" = {
+            version = "0.1.5";
+            pkg = self."assert-plus-0.1.5";
+          };
+        };
+        asn1 = {
+          "0.1.11" = {
+            version = "0.1.11";
+            pkg = self."asn1-0.1.11";
+          };
+        };
+        ctype = {
+          "0.5.3" = {
+            version = "0.5.3";
+            pkg = self."ctype-0.5.3";
+          };
+        };
+      };
+      meta = {
+        description = "Reference implementation of Joyent's HTTP Signature scheme.";
+        homepage = https://github.com/joyent/node-http-signature/;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "assert-plus-0.1.5" = buildNodePackage {
+      name = "assert-plus";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz";
+        sha1 = "ee74009413002d84cec7219c6ac811812e723160";
+      };
+      dependencies = {};
+      meta = {
+        description = "Extra assertions on top of node's assert module";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "assert-plus-^0.1.5" = self."assert-plus-0.1.5";
+    "asn1-0.1.11" = buildNodePackage {
+      name = "asn1";
+      version = "0.1.11";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz";
+        sha1 = "559be18376d08a4ec4dbe80877d27818639b2df7";
+      };
+      dependencies = {};
+      meta = {
+        description = "Contains parsers and serializers for ASN.1 (currently BER only)";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "ctype-0.5.3" = buildNodePackage {
+      name = "ctype";
+      version = "0.5.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz";
+        sha1 = "82c18c2461f74114ef16c135224ad0b9144ca12f";
+      };
+      meta = {
+        description = "read and write binary structures and data types";
+        homepage = https://github.com/rmustacc/node-ctype;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "http-signature-~0.11.0" = self."http-signature-0.11.0";
+    "oauth-sign-0.8.0" = buildNodePackage {
+      name = "oauth-sign";
+      version = "0.8.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz";
+        sha1 = "938fdc875765ba527137d8aec9d178e24debc553";
+      };
+      dependencies = {};
+      meta = {
+        description = "OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module.";
+        homepage = "https://github.com/mikeal/oauth-sign#readme";
+        license = "Apache-2.0";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "oauth-sign-~0.8.0" = self."oauth-sign-0.8.0";
+    "hawk-3.1.2" = buildNodePackage {
+      name = "hawk";
+      version = "3.1.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz";
+        sha1 = "90c90118886e21975d1ad4ae9b3e284ed19a2de8";
+      };
+      dependencies = {
+        hoek = {
+          "2.x.x" = {
+            version = "2.16.3";
+            pkg = self."hoek-2.16.3";
+          };
+        };
+        boom = {
+          "2.x.x" = {
+            version = "2.10.1";
+            pkg = self."boom-2.10.1";
+          };
+        };
+        cryptiles = {
+          "2.x.x" = {
+            version = "2.0.5";
+            pkg = self."cryptiles-2.0.5";
+          };
+        };
+        sntp = {
+          "1.x.x" = {
+            version = "1.0.9";
+            pkg = self."sntp-1.0.9";
+          };
+        };
+      };
+      meta = {
+        description = "HTTP Hawk Authentication Scheme";
+        homepage = "https://github.com/hueniverse/hawk#readme";
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "hoek-2.16.3" = buildNodePackage {
+      name = "hoek";
+      version = "2.16.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz";
+        sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
+      };
+      dependencies = {};
+      meta = {
+        description = "General purpose node utilities";
+        homepage = "https://github.com/hapijs/hoek#readme";
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "hoek-2.x.x" = self."hoek-2.16.3";
+    "boom-2.10.1" = buildNodePackage {
+      name = "boom";
+      version = "2.10.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/boom/-/boom-2.10.1.tgz";
+        sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
+      };
+      dependencies = {
+        hoek = {
+          "2.x.x" = {
+            version = "2.16.3";
+            pkg = self."hoek-2.16.3";
+          };
+        };
+      };
+      meta = {
+        description = "HTTP-friendly error objects";
+        homepage = "https://github.com/hapijs/boom#readme";
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "boom-2.x.x" = self."boom-2.10.1";
+    "cryptiles-2.0.5" = buildNodePackage {
+      name = "cryptiles";
+      version = "2.0.5";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz";
+        sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
+      };
+      dependencies = {
+        boom = {
+          "2.x.x" = {
+            version = "2.10.1";
+            pkg = self."boom-2.10.1";
+          };
+        };
+      };
+      meta = {
+        description = "General purpose crypto utilities";
+        homepage = "https://github.com/hapijs/cryptiles#readme";
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "cryptiles-2.x.x" = self."cryptiles-2.0.5";
+    "sntp-1.0.9" = buildNodePackage {
+      name = "sntp";
+      version = "1.0.9";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz";
+        sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
+      };
+      dependencies = {
+        hoek = {
+          "2.x.x" = {
+            version = "2.16.3";
+            pkg = self."hoek-2.16.3";
+          };
+        };
+      };
+      meta = {
+        description = "SNTP Client";
+        homepage = https://github.com/hueniverse/sntp;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "sntp-1.x.x" = self."sntp-1.0.9";
+    "hawk-~3.1.0" = self."hawk-3.1.2";
+    "aws-sign2-0.5.0" = buildNodePackage {
+      name = "aws-sign2";
+      version = "0.5.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz";
+        sha1 = "c57103f7a17fc037f02d7c2e64b602ea223f7d63";
+      };
+      dependencies = {};
+      meta = {
+        description = "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "aws-sign2-~0.5.0" = self."aws-sign2-0.5.0";
+    "stringstream-0.0.5" = buildNodePackage {
+      name = "stringstream";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz";
+        sha1 = "4e484cd4de5a0bbbee18e46307710a8a81621878";
+      };
+      meta = {
+        description = "Encode and decode streams into string streams";
+        homepage = "https://github.com/mhart/StringStream#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "stringstream-~0.0.4" = self."stringstream-0.0.5";
+    "combined-stream-~1.0.1" = self."combined-stream-1.0.5";
+    "isstream-0.1.2" = buildNodePackage {
+      name = "isstream";
+      version = "0.1.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
+        sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
+      };
+      meta = {
+        description = "Determine if an object is a Stream";
+        homepage = https://github.com/rvagg/isstream;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "isstream-~0.1.1" = self."isstream-0.1.2";
+    "har-validator-1.8.0" = buildNodePackage {
+      name = "har-validator";
+      version = "1.8.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz";
+        sha1 = "d83842b0eb4c435960aeb108a067a3aa94c0eeb2";
+      };
+      dependencies = {
+        bluebird = {
+          "^2.9.30" = {
+            version = "2.10.2";
+            pkg = self."bluebird-2.10.2";
+          };
+        };
+        chalk = {
+          "^1.0.0" = {
+            version = "1.1.1";
+            pkg = self."chalk-1.1.1";
+          };
+        };
+        commander = {
+          "^2.8.1" = {
+            version = "2.9.0";
+            pkg = self."commander-2.9.0";
+          };
+        };
+        is-my-json-valid = {
+          "^2.12.0" = {
+            version = "2.12.3";
+            pkg = self."is-my-json-valid-2.12.3";
+          };
+        };
+      };
+      meta = {
+        description = "Extremely fast HTTP Archive (HAR) validator using JSON Schema";
+        homepage = https://github.com/ahmadnassri/har-validator;
+        license = "ISC";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "bluebird-2.10.2" = buildNodePackage {
+      name = "bluebird";
+      version = "2.10.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz";
+        sha1 = "024a5517295308857f14f91f1106fc3b555f446b";
+      };
+      meta = {
+        description = "Full featured Promises/A+ implementation with exceptionally good performance";
+        homepage = https://github.com/petkaantonov/bluebird;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "bluebird-^2.9.30" = self."bluebird-2.10.2";
+    "chalk-1.1.1" = buildNodePackage {
+      name = "chalk";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz";
+        sha1 = "509afb67066e7499f7eb3535c77445772ae2d019";
+      };
+      dependencies = {
+        ansi-styles = {
+          "^2.1.0" = {
+            version = "2.1.0";
+            pkg = self."ansi-styles-2.1.0";
+          };
+        };
+        escape-string-regexp = {
+          "^1.0.2" = {
+            version = "1.0.4";
+            pkg = self."escape-string-regexp-1.0.4";
+          };
+        };
+        has-ansi = {
+          "^2.0.0" = {
+            version = "2.0.0";
+            pkg = self."has-ansi-2.0.0";
+          };
+        };
+        strip-ansi = {
+          "^3.0.0" = {
+            version = "3.0.0";
+            pkg = self."strip-ansi-3.0.0";
+          };
+        };
+        supports-color = {
+          "^2.0.0" = {
+            version = "2.0.0";
+            pkg = self."supports-color-2.0.0";
+          };
+        };
+      };
+      meta = {
+        description = "Terminal string styling done right. Much color.";
+        homepage = "https://github.com/chalk/chalk#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "ansi-styles-2.1.0" = buildNodePackage {
+      name = "ansi-styles";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz";
+        sha1 = "990f747146927b559a932bf92959163d60c0d0e2";
+      };
+      meta = {
+        description = "ANSI escape codes for styling strings in the terminal";
+        homepage = https://github.com/chalk/ansi-styles;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "ansi-styles-^2.1.0" = self."ansi-styles-2.1.0";
+    "escape-string-regexp-1.0.4" = buildNodePackage {
+      name = "escape-string-regexp";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz";
+        sha1 = "b85e679b46f72d03fbbe8a3bf7259d535c21b62f";
+      };
+      meta = {
+        description = "Escape RegExp special characters";
+        homepage = https://github.com/sindresorhus/escape-string-regexp;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "escape-string-regexp-^1.0.2" = self."escape-string-regexp-1.0.4";
+    "has-ansi-2.0.0" = buildNodePackage {
+      name = "has-ansi";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
+      };
+      dependencies = {
+        ansi-regex = {
+          "^2.0.0" = {
+            version = "2.0.0";
+            pkg = self."ansi-regex-2.0.0";
+          };
+        };
+      };
+      meta = {
+        description = "Check if a string has ANSI escape codes";
+        homepage = https://github.com/sindresorhus/has-ansi;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "ansi-regex-2.0.0" = buildNodePackage {
+      name = "ansi-regex";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz";
+        sha1 = "c5061b6e0ef8a81775e50f5d66151bf6bf371107";
+      };
+      meta = {
+        description = "Regular expression for matching ANSI escape codes";
+        homepage = https://github.com/sindresorhus/ansi-regex;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "ansi-regex-^2.0.0" = self."ansi-regex-2.0.0";
+    "has-ansi-^2.0.0" = self."has-ansi-2.0.0";
+    "strip-ansi-3.0.0" = buildNodePackage {
+      name = "strip-ansi";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz";
+        sha1 = "7510b665567ca914ccb5d7e072763ac968be3724";
+      };
+      dependencies = {
+        ansi-regex = {
+          "^2.0.0" = {
+            version = "2.0.0";
+            pkg = self."ansi-regex-2.0.0";
+          };
+        };
+      };
+      meta = {
+        description = "Strip ANSI escape codes";
+        homepage = https://github.com/sindresorhus/strip-ansi;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "strip-ansi-^3.0.0" = self."strip-ansi-3.0.0";
+    "supports-color-2.0.0" = buildNodePackage {
+      name = "supports-color";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
+        sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
+      };
+      meta = {
+        description = "Detect whether a terminal supports color";
+        homepage = https://github.com/chalk/supports-color;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "supports-color-^2.0.0" = self."supports-color-2.0.0";
+    "chalk-^1.0.0" = self."chalk-1.1.1";
+    "commander-2.9.0" = buildNodePackage {
+      name = "commander";
+      version = "2.9.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz";
+        sha1 = "9c99094176e12240cb22d6c5146098400fe0f7d4";
+      };
+      dependencies = {
+        graceful-readlink = {
+          ">= 1.0.0" = {
+            version = "1.0.1";
+            pkg = self."graceful-readlink-1.0.1";
+          };
+        };
+      };
+      meta = {
+        description = "the complete solution for node.js command-line programs";
+        homepage = "https://github.com/tj/commander.js#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "graceful-readlink-1.0.1" = buildNodePackage {
+      name = "graceful-readlink";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz";
+        sha1 = "4cafad76bc62f02fa039b2f94e9a3dd3a391a725";
+      };
+      meta = {
+        description = "graceful fs.readlink";
+        homepage = https://github.com/zhiyelee/graceful-readlink;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "graceful-readlink->= 1.0.0" = self."graceful-readlink-1.0.1";
+    "commander-^2.8.1" = self."commander-2.9.0";
+    "is-my-json-valid-2.12.3" = buildNodePackage {
+      name = "is-my-json-valid";
+      version = "2.12.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz";
+        sha1 = "5a39d1d76b2dbb83140bbd157b1d5ee4bdc85ad6";
+      };
+      dependencies = {
+        generate-function = {
+          "^2.0.0" = {
+            version = "2.0.0";
+            pkg = self."generate-function-2.0.0";
+          };
+        };
+        generate-object-property = {
+          "^1.1.0" = {
+            version = "1.2.0";
+            pkg = self."generate-object-property-1.2.0";
+          };
+        };
+        jsonpointer = {
+          "2.0.0" = {
+            version = "2.0.0";
+            pkg = self."jsonpointer-2.0.0";
+          };
+        };
+        xtend = {
+          "^4.0.0" = {
+            version = "4.0.1";
+            pkg = self."xtend-4.0.1";
+          };
+        };
+      };
+      meta = {
+        description = "A JSONSchema validator that uses code generation to be extremely fast";
+        homepage = https://github.com/mafintosh/is-my-json-valid;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "generate-function-2.0.0" = buildNodePackage {
+      name = "generate-function";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz";
+        sha1 = "6858fe7c0969b7d4e9093337647ac79f60dfbe74";
+      };
+      meta = {
+        description = "Module that helps you write generated functions in Node";
+        homepage = https://github.com/mafintosh/generate-function;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "generate-function-^2.0.0" = self."generate-function-2.0.0";
+    "generate-object-property-1.2.0" = buildNodePackage {
+      name = "generate-object-property";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz";
+        sha1 = "9c0e1c40308ce804f4783618b937fa88f99d50d0";
+      };
+      dependencies = {
+        is-property = {
+          "^1.0.0" = {
+            version = "1.0.2";
+            pkg = self."is-property-1.0.2";
+          };
+        };
+      };
+      meta = {
+        description = "Generate safe JS code that can used to reference a object property";
+        homepage = https://github.com/mafintosh/generate-object-property;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "is-property-1.0.2" = buildNodePackage {
+      name = "is-property";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz";
+        sha1 = "57fe1c4e48474edd65b09911f26b1cd4095dda84";
+      };
+      dependencies = {};
+      meta = {
+        description = "Tests if a JSON property can be accessed using . syntax";
+        homepage = https://github.com/mikolalysenko/is-property;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "is-property-^1.0.0" = self."is-property-1.0.2";
+    "generate-object-property-^1.1.0" = self."generate-object-property-1.2.0";
+    "jsonpointer-2.0.0" = buildNodePackage {
+      name = "jsonpointer";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz";
+        sha1 = "3af1dd20fe85463910d469a385e33017d2a030d9";
+      };
+      meta = {
+        description = "Simple JSON Addressing.";
+        homepage = "https://github.com/janl/node-jsonpointer#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "xtend-4.0.1" = buildNodePackage {
+      name = "xtend";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz";
+        sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
+      };
+      dependencies = {};
+      meta = {
+        description = "extend like a boss";
+        homepage = https://github.com/Raynos/xtend;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "xtend-^4.0.0" = self."xtend-4.0.1";
+    "is-my-json-valid-^2.12.0" = self."is-my-json-valid-2.12.3";
+    "har-validator-^1.6.1" = self."har-validator-1.8.0";
+    "semver-5.0.1" = buildNodePackage {
+      name = "semver";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/semver/-/semver-5.0.1.tgz";
+        sha1 = "9fb3f4004f900d83c47968fe42f7583e05832cc9";
+      };
+      meta = {
+        description = "The semantic version parser used by npm.";
+        homepage = "https://github.com/npm/node-semver#readme";
+        license = "ISC";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "temp-0.8.3" = buildNodePackage {
+      name = "temp";
+      version = "0.8.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/temp/-/temp-0.8.3.tgz";
+        sha1 = "e0c6bc4d26b903124410e4fed81103014dfc1f59";
+      };
+      dependencies = {
+        os-tmpdir = {
+          "^1.0.0" = {
+            version = "1.0.1";
+            pkg = self."os-tmpdir-1.0.1";
+          };
+        };
+        rimraf = {
+          "~2.2.6" = {
+            version = "2.2.8";
+            pkg = self."rimraf-2.2.8";
+          };
+        };
+      };
+      meta = {
+        description = "Temporary files and directories";
+        homepage = https://github.com/bruce/node-temp;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "os-tmpdir-1.0.1" = buildNodePackage {
+      name = "os-tmpdir";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz";
+        sha1 = "e9b423a1edaf479882562e92ed71d7743a071b6e";
+      };
+      meta = {
+        description = "Node.js os.tmpdir() ponyfill";
+        homepage = https://github.com/sindresorhus/os-tmpdir;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "os-tmpdir-^1.0.0" = self."os-tmpdir-1.0.1";
+    "rimraf-2.2.8" = buildNodePackage {
+      name = "rimraf";
+      version = "2.2.8";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz";
+        sha1 = "e439be2aaee327321952730f99a8929e4fc50582";
+      };
+      meta = {
+        description = "A deep deletion module for node (like `rm -rf`)";
+        homepage = https://github.com/isaacs/rimraf;
+        license = {
+          type = "MIT";
+          url = "https://github.com/isaacs/rimraf/raw/master/LICENSE";
+        };
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "rimraf-~2.2.6" = self."rimraf-2.2.8";
+    "wrench-1.5.8" = buildNodePackage {
+      name = "wrench";
+      version = "1.5.8";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/wrench/-/wrench-1.5.8.tgz";
+        sha1 = "7a31c97f7869246d76c5cf2f5c977a1c4c8e5ab5";
+      };
+      dependencies = {};
+      meta = {
+        description = "Recursive filesystem (and other) operations that Node *should* have.";
+        homepage = https://github.com/ryanmcgrath/wrench-js;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "uglify-js-2.4.24" = buildNodePackage {
+      name = "uglify-js";
+      version = "2.4.24";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz";
+        sha1 = "fad5755c1e1577658bb06ff9ab6e548c95bebd6e";
+      };
+      dependencies = {
+        async = {
+          "~0.2.6" = {
+            version = "0.2.10";
+            pkg = self."async-0.2.10";
+          };
+        };
+        source-map = {
+          "0.1.34" = {
+            version = "0.1.34";
+            pkg = self."source-map-0.1.34";
+          };
+        };
+        uglify-to-browserify = {
+          "~1.0.0" = {
+            version = "1.0.2";
+            pkg = self."uglify-to-browserify-1.0.2";
+          };
+        };
+        yargs = {
+          "~3.5.4" = {
+            version = "3.5.4";
+            pkg = self."yargs-3.5.4";
+          };
+        };
+      };
+      meta = {
+        description = "JavaScript parser, mangler/compressor and beautifier toolkit";
+        homepage = http://lisperator.net/uglifyjs;
+        license = "BSD";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "async-0.2.10" = buildNodePackage {
+      name = "async";
+      version = "0.2.10";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/async/-/async-0.2.10.tgz";
+        sha1 = "b6bbe0b0674b9d719708ca38de8c237cb526c3d1";
+      };
+      meta = {
+        description = "Higher-order functions and common patterns for asynchronous code";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "async-~0.2.6" = self."async-0.2.10";
+    "source-map-0.1.34" = buildNodePackage {
+      name = "source-map";
+      version = "0.1.34";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz";
+        sha1 = "a7cfe89aec7b1682c3b198d0acfb47d7d090566b";
+      };
+      dependencies = {
+        amdefine = {
+          ">=0.0.4" = {
+            version = "1.0.0";
+            pkg = self."amdefine-1.0.0";
+          };
+        };
+      };
+      meta = {
+        description = "Generates and consumes source maps";
+        homepage = https://github.com/mozilla/source-map;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "uglify-to-browserify-1.0.2" = buildNodePackage {
+      name = "uglify-to-browserify";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz";
+        sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7";
+      };
+      dependencies = {};
+      meta = {
+        description = "A transform to make UglifyJS work in browserify.";
+        homepage = https://github.com/ForbesLindesay/uglify-to-browserify;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "uglify-to-browserify-~1.0.0" = self."uglify-to-browserify-1.0.2";
+    "yargs-3.5.4" = buildNodePackage {
+      name = "yargs";
+      version = "3.5.4";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz";
+        sha1 = "d8aff8f665e94c34bd259bdebd1bfaf0ddd35361";
+      };
+      dependencies = {
+        camelcase = {
+          "^1.0.2" = {
+            version = "1.2.1";
+            pkg = self."camelcase-1.2.1";
+          };
+        };
+        decamelize = {
+          "^1.0.0" = {
+            version = "1.1.2";
+            pkg = self."decamelize-1.1.2";
+          };
+        };
+        window-size = {
+          "0.1.0" = {
+            version = "0.1.0";
+            pkg = self."window-size-0.1.0";
+          };
+        };
+        wordwrap = {
+          "0.0.2" = {
+            version = "0.0.2";
+            pkg = self."wordwrap-0.0.2";
+          };
+        };
+      };
+      meta = {
+        description = "Light-weight option parsing with an argv hash. No optstrings attached.";
+        homepage = https://github.com/bcoe/yargs;
+        license = "MIT/X11";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "camelcase-1.2.1" = buildNodePackage {
+      name = "camelcase";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz";
+        sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39";
+      };
+      meta = {
+        description = "Convert a dash/dot/underscore/space separated string to camelCase: foo-bar → fooBar";
+        homepage = https://github.com/sindresorhus/camelcase;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "camelcase-^1.0.2" = self."camelcase-1.2.1";
+    "decamelize-1.1.2" = buildNodePackage {
+      name = "decamelize";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/decamelize/-/decamelize-1.1.2.tgz";
+        sha1 = "dcc93727be209632e98b02718ef4cb79602322f2";
+      };
+      dependencies = {
+        escape-string-regexp = {
+          "^1.0.4" = {
+            version = "1.0.4";
+            pkg = self."escape-string-regexp-1.0.4";
+          };
+        };
+      };
+      meta = {
+        description = "Convert a camelized string into a lowercased one with a custom separator: unicornRainbow → unicorn_rainbow";
+        homepage = https://github.com/sindresorhus/decamelize;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "escape-string-regexp-^1.0.4" = self."escape-string-regexp-1.0.4";
+    "decamelize-^1.0.0" = self."decamelize-1.1.2";
+    "window-size-0.1.0" = buildNodePackage {
+      name = "window-size";
+      version = "0.1.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz";
+        sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d";
+      };
+      meta = {
+        description = "Reliable way to to get the height and width of the terminal/console in a node.js environment.";
+        homepage = https://github.com/jonschlinkert/window-size;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "wordwrap-0.0.2" = buildNodePackage {
+      name = "wordwrap";
+      version = "0.0.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz";
+        sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f";
+      };
+      dependencies = {};
+      meta = {
+        description = "Wrap those words. Show them at what columns to start and stop.";
+        license = "MIT/X11";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "yargs-~3.5.4" = self."yargs-3.5.4";
+    "xmldom-0.1.19" = buildNodePackage {
+      name = "xmldom";
+      version = "0.1.19";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/xmldom/-/xmldom-0.1.19.tgz";
+        sha1 = "631fc07776efd84118bf25171b37ed4d075a0abc";
+      };
+      dependencies = {};
+      meta = {
+        description = "A W3C Standard XML DOM(Level2 CORE) implementation and parser(DOMParser/XMLSerializer).";
+        homepage = https://github.com/jindw/xmldom;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "request-2.62.0" = buildNodePackage {
+      name = "request";
+      version = "2.62.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/request/-/request-2.62.0.tgz";
+        sha1 = "55c165f702a146f1e21e0725c0b75e1136487b0f";
+      };
+      dependencies = {
+        bl = {
+          "~1.0.0" = {
+            version = "1.0.0";
+            pkg = self."bl-1.0.0";
+          };
+        };
+        caseless = {
+          "~0.11.0" = {
+            version = "0.11.0";
+            pkg = self."caseless-0.11.0";
+          };
+        };
+        extend = {
+          "~3.0.0" = {
+            version = "3.0.0";
+            pkg = self."extend-3.0.0";
+          };
+        };
+        forever-agent = {
+          "~0.6.0" = {
+            version = "0.6.1";
+            pkg = self."forever-agent-0.6.1";
+          };
+        };
+        form-data = {
+          "~1.0.0-rc1" = {
+            version = "1.0.0-rc3";
+            pkg = self."form-data-1.0.0-rc3";
+          };
+        };
+        json-stringify-safe = {
+          "~5.0.0" = {
+            version = "5.0.1";
+            pkg = self."json-stringify-safe-5.0.1";
+          };
+        };
+        mime-types = {
+          "~2.1.2" = {
+            version = "2.1.8";
+            pkg = self."mime-types-2.1.8";
+          };
+        };
+        node-uuid = {
+          "~1.4.0" = {
+            version = "1.4.7";
+            pkg = self."node-uuid-1.4.7";
+          };
+        };
+        qs = {
+          "~5.1.0" = {
+            version = "5.1.0";
+            pkg = self."qs-5.1.0";
+          };
+        };
+        tunnel-agent = {
+          "~0.4.0" = {
+            version = "0.4.2";
+            pkg = self."tunnel-agent-0.4.2";
+          };
+        };
+        tough-cookie = {
+          ">=0.12.0" = {
+            version = "2.2.1";
+            pkg = self."tough-cookie-2.2.1";
+          };
+        };
+        http-signature = {
+          "~0.11.0" = {
+            version = "0.11.0";
+            pkg = self."http-signature-0.11.0";
+          };
+        };
+        oauth-sign = {
+          "~0.8.0" = {
+            version = "0.8.0";
+            pkg = self."oauth-sign-0.8.0";
+          };
+        };
+        hawk = {
+          "~3.1.0" = {
+            version = "3.1.2";
+            pkg = self."hawk-3.1.2";
+          };
+        };
+        aws-sign2 = {
+          "~0.5.0" = {
+            version = "0.5.0";
+            pkg = self."aws-sign2-0.5.0";
+          };
+        };
+        stringstream = {
+          "~0.0.4" = {
+            version = "0.0.5";
+            pkg = self."stringstream-0.0.5";
+          };
+        };
+        combined-stream = {
+          "~1.0.1" = {
+            version = "1.0.5";
+            pkg = self."combined-stream-1.0.5";
+          };
+        };
+        isstream = {
+          "~0.1.1" = {
+            version = "0.1.2";
+            pkg = self."isstream-0.1.2";
+          };
+        };
+        har-validator = {
+          "^1.6.1" = {
+            version = "1.8.0";
+            pkg = self."har-validator-1.8.0";
+          };
+        };
+      };
+      meta = {
+        description = "Simplified HTTP request client.";
+        homepage = "https://github.com/request/request#readme";
+        license = "Apache-2.0";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "qs-5.1.0" = buildNodePackage {
+      name = "qs";
+      version = "5.1.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/qs/-/qs-5.1.0.tgz";
+        sha1 = "4d932e5c7ea411cca76a312d39a606200fd50cd9";
+      };
+      dependencies = {};
+      meta = {
+        description = "A querystring parser that supports nesting and arrays, with a depth limit";
+        homepage = https://github.com/hapijs/qs;
+        license = "BSD-3-Clause";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "qs-~5.1.0" = self."qs-5.1.0";
+    "semver-5.0.3" = buildNodePackage {
+      name = "semver";
+      version = "5.0.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/semver/-/semver-5.0.3.tgz";
+        sha1 = "77466de589cd5d3c95f138aa78bc569a3cb5d27a";
+      };
+      meta = {
+        description = "The semantic version parser used by npm.";
+        homepage = "https://github.com/npm/node-semver#readme";
+        license = "ISC";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "winston-1.0.2" = buildNodePackage {
+      name = "winston";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/winston/-/winston-1.0.2.tgz";
+        sha1 = "351c58e2323f8a4ca29a45195aa9aa3b4c35d76f";
+      };
+      dependencies = {
+        async = {
+          "~1.0.0" = {
+            version = "1.0.0";
+            pkg = self."async-1.0.0";
+          };
+        };
+        colors = {
+          "1.0.x" = {
+            version = "1.0.3";
+            pkg = self."colors-1.0.3";
+          };
+        };
+        cycle = {
+          "1.0.x" = {
+            version = "1.0.3";
+            pkg = self."cycle-1.0.3";
+          };
+        };
+        eyes = {
+          "0.1.x" = {
+            version = "0.1.8";
+            pkg = self."eyes-0.1.8";
+          };
+        };
+        isstream = {
+          "0.1.x" = {
+            version = "0.1.2";
+            pkg = self."isstream-0.1.2";
+          };
+        };
+        pkginfo = {
+          "0.3.x" = {
+            version = "0.3.1";
+            pkg = self."pkginfo-0.3.1";
+          };
+        };
+        stack-trace = {
+          "0.0.x" = {
+            version = "0.0.9";
+            pkg = self."stack-trace-0.0.9";
+          };
+        };
+      };
+      meta = {
+        description = "A multi-transport async logging library for Node.js";
+        homepage = "https://github.com/winstonjs/winston#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "async-1.0.0" = buildNodePackage {
+      name = "async";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/async/-/async-1.0.0.tgz";
+        sha1 = "f8fc04ca3a13784ade9e1641af98578cfbd647a9";
+      };
+      meta = {
+        description = "Higher-order functions and common patterns for asynchronous code";
+        homepage = "https://github.com/caolan/async#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "async-~1.0.0" = self."async-1.0.0";
+    "colors-1.0.3" = buildNodePackage {
+      name = "colors";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz";
+        sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b";
+      };
+      meta = {
+        description = "get colors in your node.js console";
+        homepage = https://github.com/Marak/colors.js;
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "colors-1.0.x" = self."colors-1.0.3";
+    "cycle-1.0.3" = buildNodePackage {
+      name = "cycle";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz";
+        sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
+      };
+      meta = {
+        description = "decycle your json";
+        homepage = https://github.com/douglascrockford/JSON-js;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "cycle-1.0.x" = self."cycle-1.0.3";
+    "eyes-0.1.8" = buildNodePackage {
+      name = "eyes";
+      version = "0.1.8";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz";
+        sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
+      };
+      meta = {
+        description = "a customizable value inspector";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "eyes-0.1.x" = self."eyes-0.1.8";
+    "isstream-0.1.x" = self."isstream-0.1.2";
+    "pkginfo-0.3.1" = buildNodePackage {
+      name = "pkginfo";
+      version = "0.3.1";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz";
+        sha1 = "5b29f6a81f70717142e09e765bbeab97b4f81e21";
+      };
+      meta = {
+        description = "An easy way to expose properties on a module from a package.json";
+        homepage = "https://github.com/indexzero/node-pkginfo#readme";
+        license = "MIT";
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "pkginfo-0.3.x" = self."pkginfo-0.3.1";
+    "stack-trace-0.0.9" = buildNodePackage {
+      name = "stack-trace";
+      version = "0.0.9";
+      src = fetchurl {
+        url = "http://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz";
+        sha1 = "a8f6eaeca90674c333e7c43953f275b451510695";
+      };
+      dependencies = {};
+      meta = {
+        description = "Get v8 stack traces as an array of CallSite objects.";
+        homepage = https://github.com/felixge/node-stack-trace;
+      };
+      production = true;
+      linkDependencies = false;
+    };
+    "stack-trace-0.0.x" = self."stack-trace-0.0.9";
+    "winston-1.0.x" = self."winston-1.0.2";
+    titanium = self."titanium-5.0.5";
+  };
+in
+registry
\ No newline at end of file
diff --git a/pkgs/development/mobile/titaniumenv/default.nix b/pkgs/development/mobile/titaniumenv/default.nix
index cc3f607c0c3..f1ea4dc2342 100644
--- a/pkgs/development/mobile/titaniumenv/default.nix
+++ b/pkgs/development/mobile/titaniumenv/default.nix
@@ -1,25 +1,5 @@
-{pkgs, pkgs_i686, xcodeVersion ? "6.1.1", xcodeBaseDir ? "/Applications/Xcode.app", tiVersion ? "3.5.1.GA"}:
+{pkgs, pkgs_i686, xcodeVersion ? "7.2", xcodeBaseDir ? "/Applications/Xcode.app", tiVersion ? "5.1.1.GA"}:
 
-let
-  # We have to use Oracle's JDK. On Darwin, just simply expose the host system's
-  # JDK. According to their docs, OpenJDK is not supported.
-  
-  jdkWrapper = pkgs.stdenv.mkDerivation {
-    name = "jdk-wrapper";
-    buildCommand = ''
-      mkdir -p $out/bin
-      cd $out/bin
-      ln -s /usr/bin/javac
-      ln -s /usr/bin/java
-      ln -s /usr/bin/jarsigner
-      ln -s /usr/bin/jar
-      ln -s /usr/bin/keytool
-    '';
-    setupHook = ''
-      export JAVA_HOME=/usr
-    '';
-  };
-in
 rec {
   androidenv = pkgs.androidenv;
 
@@ -29,11 +9,7 @@ rec {
   } else null;
   
   titaniumsdk = let
-    titaniumSdkFile = if tiVersion == "3.1.4.GA" then ./titaniumsdk-3.1.nix
-      else if tiVersion == "3.2.3.GA" then ./titaniumsdk-3.2.nix
-      else if tiVersion == "3.3.0.GA" then ./titaniumsdk-3.3.nix
-      else if tiVersion == "3.4.0.GA" then ./titaniumsdk-3.4.nix
-      else if tiVersion == "3.5.1.GA" then ./titaniumsdk-3.5.nix
+    titaniumSdkFile = if tiVersion == "5.1.1.GA" then ./titaniumsdk-5.1.nix
       else throw "Titanium version not supported: "+tiVersion;
     in
     import titaniumSdkFile {
@@ -41,11 +17,8 @@ rec {
     };
   
   buildApp = import ./build-app.nix {
-    inherit (pkgs) stdenv python which;
-    jdk = if pkgs.stdenv.isLinux then pkgs.oraclejdk7
-      else if pkgs.stdenv.isDarwin then jdkWrapper
-      else throw "Platform not supported: ${pkgs.stdenv.system}";
-    inherit (pkgs.nodePackages) titanium;
+    inherit (pkgs) stdenv python which jdk;
+    titanium = (import ./cli { inherit (pkgs.stdenv) system; }).titanium {};
     inherit (androidenv) androidsdk;
     inherit (xcodeenv) xcodewrapper;
     inherit titaniumsdk xcodeBaseDir;
diff --git a/pkgs/development/mobile/titaniumenv/examples/default.nix b/pkgs/development/mobile/titaniumenv/examples/default.nix
index 13345f5dedd..be2ee419ff4 100644
--- a/pkgs/development/mobile/titaniumenv/examples/default.nix
+++ b/pkgs/development/mobile/titaniumenv/examples/default.nix
@@ -1,10 +1,10 @@
 { nixpkgs ? <nixpkgs>
 , systems ? [ "x86_64-linux" "x86_64-darwin" ]
-, xcodeVersion ? "6.1.1"
+, xcodeVersion ? "7.2"
 , xcodeBaseDir ? "/Applications/Xcode.app"
-, tiVersion ? "3.5.1.GA"
+, tiVersion ? "5.1.1.GA"
 , rename ? false
-, newBundleId ? "com.example.kitchensink", iosMobileProvisioningProfile ? null, iosCertificate ? null, iosCertificateName ? "Example", iosCertificatePassword ? "", iosVersion ? "8.1", iosWwdrCertificate ? null
+, newBundleId ? "com.example.kitchensink", iosMobileProvisioningProfile ? null, iosCertificate ? null, iosCertificateName ? "Example", iosCertificatePassword ? "", iosVersion ? "9.2", iosWwdrCertificate ? null
 , allowUnfree ? false
 , enableWirelessDistribution ? false, installURL ? null
 }:
diff --git a/pkgs/development/mobile/titaniumenv/examples/kitchensink/default.nix b/pkgs/development/mobile/titaniumenv/examples/kitchensink/default.nix
index 91c4901479b..b6c012a77ef 100644
--- a/pkgs/development/mobile/titaniumenv/examples/kitchensink/default.nix
+++ b/pkgs/development/mobile/titaniumenv/examples/kitchensink/default.nix
@@ -1,5 +1,5 @@
-{ titaniumenv, fetchgit, target, androidPlatformVersions ? [ "14" ], tiVersion ? "3.2.3.GA", release ? false
-, rename ? false, stdenv ? null, newBundleId ? null, iosMobileProvisioningProfile ? null, iosCertificate ? null, iosCertificateName ? null, iosCertificatePassword ? null, iosVersion ? "8.1", iosWwdrCertificate ? null
+{ titaniumenv, fetchgit, target, androidPlatformVersions ? [ "23" ], tiVersion ? "5.1.1.GA", release ? false
+, rename ? false, stdenv ? null, newBundleId ? null, iosMobileProvisioningProfile ? null, iosCertificate ? null, iosCertificateName ? null, iosCertificatePassword ? null, iosVersion ? "8.1"
 , enableWirelessDistribution ? false, installURL ? null
 }:
 
@@ -8,8 +8,8 @@ assert rename -> (stdenv != null && newBundleId != null && iosMobileProvisioning
 let
   src = fetchgit {
     url = https://github.com/appcelerator/KitchenSink.git;
-    rev = "37d766ef9cba6a2d0b22634d3edc1fa8402109a0";
-    sha256 = "1d4x9zwq92p1krds52bd41qqsnsnb3a7x74bysbiphrvrphz80kk";
+    rev = "6e9f509069fafdebfa78e15b2d14f20a27a485cc";
+    sha256 = "0370dc0ca78b96a7e0befbff9cb1c248695e1aff66aceea98043bbb16c5121e6";
   };
   
   # Rename the bundle id to something else
@@ -37,6 +37,6 @@ titaniumenv.buildApp {
   androidKeyAlias = "myfirstapp";
   androidKeyStorePassword = "mykeystore";
   
-  inherit iosMobileProvisioningProfile iosCertificate iosCertificateName iosCertificatePassword iosVersion iosWwdrCertificate;
+  inherit iosMobileProvisioningProfile iosCertificate iosCertificateName iosCertificatePassword iosVersion;
   inherit enableWirelessDistribution installURL;
 }
diff --git a/pkgs/development/mobile/titaniumenv/fixnativelibs.sed b/pkgs/development/mobile/titaniumenv/fixnativelibs.sed
deleted file mode 100644
index 76b330136b6..00000000000
--- a/pkgs/development/mobile/titaniumenv/fixnativelibs.sed
+++ /dev/null
@@ -1 +0,0 @@
-s|\t\t\t\t\t\t\t\tapk_zip.write(native_lib, path_in_zip)|\t\t\t\t\t\t\t\tinfo = zipfile.ZipInfo(path_in_zip)\n\t\t\t\t\t\t\t\tinfo.compress_type = zipfile.ZIP_DEFLATED\n\t\t\t\t\t\t\t\tinfo.create_system = 3\n\t\t\t\t\t\t\t\tf = open(native_lib)\n\t\t\t\t\t\t\t\tapk_zip.writestr(info, f.read())\n\t\t\t\t\t\t\t\tf.close()|
diff --git a/pkgs/development/mobile/titaniumenv/fixso.sed b/pkgs/development/mobile/titaniumenv/fixso.sed
deleted file mode 100644
index 9a3bb0389a7..00000000000
--- a/pkgs/development/mobile/titaniumenv/fixso.sed
+++ /dev/null
@@ -1 +0,0 @@
-s|apk_zip.write(os.path.join(lib_source_dir, fname), lib_dest_dir + fname)|info = zipfile.ZipInfo(lib_dest_dir + fname)\n\t\t\t\tinfo.compress_type = zipfile.ZIP_DEFLATED\n\t\t\t\tinfo.create_system = 3\n\t\t\t\tf = open(os.path.join(lib_source_dir, fname))\n\t\t\t\tapk_zip.writestr(info, f.read())\n\t\t\t\tf.close()|
diff --git a/pkgs/development/mobile/titaniumenv/fixtiprofiler.sed b/pkgs/development/mobile/titaniumenv/fixtiprofiler.sed
deleted file mode 100644
index e9a8f5b5baa..00000000000
--- a/pkgs/development/mobile/titaniumenv/fixtiprofiler.sed
+++ /dev/null
@@ -1 +0,0 @@
-s|apk_zip.write(os.path.join(lib_source_dir, 'libtiprofiler.so'), lib_dest_dir + 'libtiprofiler.so')|info = zipfile.ZipInfo(lib_dest_dir + 'libtiprofiler.so')\n\t\t\tinfo.compress_type = zipfile.ZIP_DEFLATED\n\t\t\tinfo.create_system = 3\n\t\t\tf = open(os.path.join(lib_source_dir, 'libtiprofiler.so'))\n\t\t\tapk_zip.writestr(info, f.read())\n\t\t\tf.close()\n|
diff --git a/pkgs/development/mobile/titaniumenv/fixtiverify.sed b/pkgs/development/mobile/titaniumenv/fixtiverify.sed
deleted file mode 100644
index 8e1114769c8..00000000000
--- a/pkgs/development/mobile/titaniumenv/fixtiverify.sed
+++ /dev/null
@@ -1 +0,0 @@
-s|apk_zip.write(os.path.join(lib_source_dir, 'libtiverify.so'), lib_dest_dir + 'libtiverify.so')|info = zipfile.ZipInfo(lib_dest_dir + 'libtiverify.so')\n\t\t\tinfo.compress_type = zipfile.ZIP_DEFLATED\n\t\t\tinfo.create_system = 3\n\t\t\tf = open(os.path.join(lib_source_dir, 'libtiverify.so'))\n\t\t\tapk_zip.writestr(info, f.read())\n\t\t\tf.close()|
diff --git a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.1.nix b/pkgs/development/mobile/titaniumenv/titaniumsdk-3.1.nix
deleted file mode 100644
index 0437edad63f..00000000000
--- a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.1.nix
+++ /dev/null
@@ -1,80 +0,0 @@
-{stdenv, fetchurl, unzip, makeWrapper, python, jdk}:
-
-stdenv.mkDerivation {
-  name = "mobilesdk-3.1.4.v20130926144546";
-  src = if (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux") then fetchurl {
-    url = http://builds.appcelerator.com.s3.amazonaws.com/mobile/3_1_X/mobilesdk-3.1.4.v20130926144546-linux.zip;
-    sha1 = "da4a03ced67f0e8f442d551bbd41ea01fceeee00";
-  }
-  else if stdenv.system == "x86_64-darwin" then fetchurl {
-    url = http://builds.appcelerator.com.s3.amazonaws.com/mobile/3_1_X/mobilesdk-3.1.4.v20130926144546-osx.zip;
-    sha1 = "55f604c8edb989ba214c8ed7538d1b416df0419e";
-  }
-  else throw "Platform: ${stdenv.system} not supported!";
-  
-  buildInputs = [ unzip makeWrapper ];
-  
-  buildCommand = ''
-    mkdir -p $out
-    cd $out
-    unzip $src
-    
-    # Fix shebang header for python scripts
-    
-    find . -name \*.py | while read i
-    do
-        sed -i -e "s|#!/usr/bin/env python|#!${python}/bin/python|" $i
-    done
-   
-    # Rename ugly version number
-    cd mobilesdk/*
-    mv 3.1.4.v20130926144546 3.1.4.GA
-    cd 3.1.4.GA
-    
-    # Zip files do not support timestamps lower than 1980. We have to apply a few work-arounds to cope with that
-    # Yes, I know it's nasty :-)
-    
-    cd android
-    
-    sed -i -f ${./fixtiverify.sed} builder.py
-    sed -i -f ${./fixtiprofiler.sed} builder.py
-    sed -i -f ${./fixso.sed} builder.py
-    sed -i -f ${./fixnativelibs.sed} builder.py
-    
-    # Patch some executables
-    
-    ${if stdenv.system == "i686-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux.so.2 titanium_prep.linux32
-      ''
-      else if stdenv.system == "x86_64-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux-x86-64.so.2 titanium_prep.linux64
-      ''
-      else ""}
-    
-    # Fix zipalign compatibility issue with newer Android SDKs
-    sed -i -e 's|zipalign = self.sdk.get_zipalign()|zipalign = "zipalign"|' builder.py
-    
-    # Wrap builder script
-    mv builder.py .builder.py
-    cat > builder.py <<EOF
-    #!${python}/bin/python
-    
-    import os, sys
-    
-    os.environ['PYTHONPATH'] = '$(echo ${python.modules.sqlite3}/lib/python*/site-packages)'
-    os.environ['JAVA_HOME'] = '${jdk.home}'
-    
-    os.execv('$(pwd)/.builder.py', sys.argv)
-    EOF
-    
-    chmod +x builder.py
-    
-  '' + stdenv.lib.optionalString (stdenv.system == "x86_64-darwin") ''
-    # 'ditto' utility is needed to copy stuff to the Xcode organizer. Dirty, but this allows it to work.
-    sed -i -e "s|ditto|/usr/bin/ditto|g" $out/mobilesdk/osx/*/iphone/builder.py
-    
-    sed -i -e "s|--xcode|--xcode '+process.env['NIX_TITANIUM_WORKAROUND']+'|" $out/mobilesdk/osx/*/iphone/cli/commands/_build.js
-  '';
-}
diff --git a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.2.nix b/pkgs/development/mobile/titaniumenv/titaniumsdk-3.2.nix
deleted file mode 100644
index 37ecf62706d..00000000000
--- a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.2.nix
+++ /dev/null
@@ -1,77 +0,0 @@
-{stdenv, fetchurl, unzip, makeWrapper, python, jdk}:
-
-stdenv.mkDerivation {
-  name = "mobilesdk-3.2.3.GA";
-  src = if (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux") then fetchurl {
-    url = http://builds.appcelerator.com/mobile/3.2.3/mobilesdk-3.2.3.GA-linux.zip;
-    sha1 = "303e6d19a0ca099d47f6862c00b261c6d0206cea";
-  }
-  else if stdenv.system == "x86_64-darwin" then fetchurl {
-    url = http://builds.appcelerator.com/mobile/3.2.3/mobilesdk-3.2.3.GA-osx.zip;
-    sha1 = "8c358cbd8624ffe3dfbd0283738105157067e0fb";
-  }
-  else throw "Platform: ${stdenv.system} not supported!";
-  
-  buildInputs = [ unzip makeWrapper ];
-  
-  buildCommand = ''
-    mkdir -p $out
-    cd $out
-    unzip $src
-    
-    # Fix shebang header for python scripts
-    
-    find . -name \*.py | while read i
-    do
-        sed -i -e "s|#!/usr/bin/env python|#!${python}/bin/python|" $i
-    done
-   
-    # Rename ugly version number
-    cd mobilesdk/*
-    cd 3.2.3.GA
-    
-    # Zip files do not support timestamps lower than 1980. We have to apply a few work-arounds to cope with that
-    # Yes, I know it's nasty :-)
-    
-    cd android
-    
-    sed -i -f ${./fixtiverify.sed} builder.py
-    sed -i -f ${./fixtiprofiler.sed} builder.py
-    sed -i -f ${./fixso.sed} builder.py
-    sed -i -f ${./fixnativelibs.sed} builder.py
-    
-    # Patch some executables
-    
-    ${if stdenv.system == "i686-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux.so.2 titanium_prep.linux32
-      ''
-      else if stdenv.system == "x86_64-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux-x86-64.so.2 titanium_prep.linux64
-      ''
-      else ""}
-    
-    # Wrap builder script
-    
-    mv builder.py .builder.py
-    cat > builder.py <<EOF
-    #!${python}/bin/python
-    
-    import os, sys
-    
-    os.environ['PYTHONPATH'] = '$(echo ${python.modules.sqlite3}/lib/python*/site-packages)'
-    os.environ['JAVA_HOME'] = '${jdk.home}'
-    
-    os.execv('$(pwd)/.builder.py', sys.argv)
-    EOF
-    
-    chmod +x builder.py
-    
-  '' + stdenv.lib.optionalString (stdenv.system == "x86_64-darwin") ''
-    # 'ditto' utility is needed to copy stuff to the Xcode organizer. Dirty, but this allows it to work.
-    sed -i -e "s|ditto|/usr/bin/ditto|g" $out/mobilesdk/osx/*/iphone/builder.py
-    
-    sed -i -e "s|--xcode|--xcode '+process.env['NIX_TITANIUM_WORKAROUND']+'|" $out/mobilesdk/osx/*/iphone/cli/commands/_build.js
-  '';
-}
diff --git a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.3.nix b/pkgs/development/mobile/titaniumenv/titaniumsdk-3.3.nix
deleted file mode 100644
index b5f1c6c5312..00000000000
--- a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.3.nix
+++ /dev/null
@@ -1,77 +0,0 @@
-{stdenv, fetchurl, unzip, makeWrapper, python, jdk}:
-
-stdenv.mkDerivation {
-  name = "mobilesdk-3.3.0.GA";
-  src = if (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux") then fetchurl {
-    url = http://builds.appcelerator.com/mobile/3.3.0/mobilesdk-3.3.0.GA-linux.zip;
-    sha1 = "9a9cca05a4cf8700df60b7e9d9cd969ecb70d81e";
-  }
-  else if stdenv.system == "x86_64-darwin" then fetchurl {
-    url = http://builds.appcelerator.com/mobile/3.3.0/mobilesdk-3.3.0.GA-osx.zip;
-    sha1 = "c6333e4da2564b9c51b865c1db49a062fbc743af";
-  }
-  else throw "Platform: ${stdenv.system} not supported!";
-  
-  buildInputs = [ unzip makeWrapper ];
-  
-  buildCommand = ''
-    mkdir -p $out
-    cd $out
-    unzip $src
-    
-    # Fix shebang header for python scripts
-    
-    find . -name \*.py | while read i
-    do
-        sed -i -e "s|#!/usr/bin/env python|#!${python}/bin/python|" $i
-    done
-   
-    # Rename ugly version number
-    cd mobilesdk/*
-    cd 3.3.0.GA
-    
-    # Zip files do not support timestamps lower than 1980. We have to apply a few work-arounds to cope with that
-    # Yes, I know it's nasty :-)
-    
-    cd android
-    
-    sed -i -f ${./fixtiverify.sed} builder.py
-    sed -i -f ${./fixtiprofiler.sed} builder.py
-    sed -i -f ${./fixso.sed} builder.py
-    sed -i -f ${./fixnativelibs.sed} builder.py
-    
-    # Patch some executables
-    
-    ${if stdenv.system == "i686-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux.so.2 titanium_prep.linux32
-      ''
-      else if stdenv.system == "x86_64-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux-x86-64.so.2 titanium_prep.linux64
-      ''
-      else ""}
-    
-    # Wrap builder script
-    
-    mv builder.py .builder.py
-    cat > builder.py <<EOF
-    #!${python}/bin/python
-    
-    import os, sys
-    
-    os.environ['PYTHONPATH'] = '$(echo ${python.modules.sqlite3}/lib/python*/site-packages)'
-    os.environ['JAVA_HOME'] = '${jdk.home}'
-    
-    os.execv('$(pwd)/.builder.py', sys.argv)
-    EOF
-    
-    chmod +x builder.py
-    
-  '' + stdenv.lib.optionalString (stdenv.system == "x86_64-darwin") ''
-    # 'ditto' utility is needed to copy stuff to the Xcode organizer. Dirty, but this allows it to work.
-    sed -i -e "s|ditto|/usr/bin/ditto|g" $out/mobilesdk/osx/*/iphone/builder.py
-    
-    sed -i -e "s|--xcode|--xcode '+process.env['NIX_TITANIUM_WORKAROUND']+'|" $out/mobilesdk/osx/*/iphone/cli/commands/_build.js
-  '';
-}
diff --git a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.4.nix b/pkgs/development/mobile/titaniumenv/titaniumsdk-3.4.nix
deleted file mode 100644
index a927a74729a..00000000000
--- a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.4.nix
+++ /dev/null
@@ -1,77 +0,0 @@
-{stdenv, fetchurl, unzip, makeWrapper, python, jdk}:
-
-stdenv.mkDerivation {
-  name = "mobilesdk-3.4.0.GA";
-  src = if (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux") then fetchurl {
-    url = http://builds.appcelerator.com/mobile/3.4.0/mobilesdk-3.4.0.GA-linux.zip;
-    sha1 = "c281a3a3f3af35adc95fc00dcd525b84516c2083";
-  }
-  else if stdenv.system == "x86_64-darwin" then fetchurl {
-    url = http://builds.appcelerator.com/mobile/3.4.0/mobilesdk-3.4.0.GA-osx.zip;
-    sha1 = "2f10426462e5f8e487be83c8038f2934d5079f0d";
-  }
-  else throw "Platform: ${stdenv.system} not supported!";
-  
-  buildInputs = [ unzip makeWrapper ];
-  
-  buildCommand = ''
-    mkdir -p $out
-    cd $out
-    unzip $src
-    
-    # Fix shebang header for python scripts
-    
-    find . -name \*.py | while read i
-    do
-        sed -i -e "s|#!/usr/bin/env python|#!${python}/bin/python|" $i
-    done
-   
-    # Rename ugly version number
-    cd mobilesdk/*
-    cd 3.4.0.GA
-    
-    # Zip files do not support timestamps lower than 1980. We have to apply a few work-arounds to cope with that
-    # Yes, I know it's nasty :-)
-    
-    cd android
-    
-    sed -i -f ${./fixtiverify.sed} builder.py
-    sed -i -f ${./fixtiprofiler.sed} builder.py
-    sed -i -f ${./fixso.sed} builder.py
-    sed -i -f ${./fixnativelibs.sed} builder.py
-    
-    # Patch some executables
-    
-    ${if stdenv.system == "i686-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux.so.2 titanium_prep.linux32
-      ''
-      else if stdenv.system == "x86_64-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux-x86-64.so.2 titanium_prep.linux64
-      ''
-      else ""}
-    
-    # Wrap builder script
-    
-    mv builder.py .builder.py
-    cat > builder.py <<EOF
-    #!${python}/bin/python
-    
-    import os, sys
-    
-    os.environ['PYTHONPATH'] = '$(echo ${python.modules.sqlite3}/lib/python*/site-packages)'
-    os.environ['JAVA_HOME'] = '${jdk.home}'
-    
-    os.execv('$(pwd)/.builder.py', sys.argv)
-    EOF
-    
-    chmod +x builder.py
-    
-  '' + stdenv.lib.optionalString (stdenv.system == "x86_64-darwin") ''
-    # 'ditto' utility is needed to copy stuff to the Xcode organizer. Dirty, but this allows it to work.
-    sed -i -e "s|ditto|/usr/bin/ditto|g" $out/mobilesdk/osx/*/iphone/builder.py
-    
-    sed -i -e "s|--xcode|--xcode '+process.env['NIX_TITANIUM_WORKAROUND']+'|" $out/mobilesdk/osx/*/iphone/cli/commands/_build.js
-  '';
-}
diff --git a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.5.nix b/pkgs/development/mobile/titaniumenv/titaniumsdk-3.5.nix
deleted file mode 100644
index 3fa119dda65..00000000000
--- a/pkgs/development/mobile/titaniumenv/titaniumsdk-3.5.nix
+++ /dev/null
@@ -1,77 +0,0 @@
-{stdenv, fetchurl, unzip, makeWrapper, python, jdk}:
-
-stdenv.mkDerivation {
-  name = "mobilesdk-3.5.1.GA";
-  src = if (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux") then fetchurl {
-    url = http://builds.appcelerator.com/mobile/3.5.1/mobilesdk-3.5.1.GA-linux.zip;
-    sha1 = "2fd8c50081af9d03b65ffaf824e2e417832efd92";
-  }
-  else if stdenv.system == "x86_64-darwin" then fetchurl {
-    url = http://builds.appcelerator.com/mobile/3.5.1/mobilesdk-3.5.1.GA-osx.zip;
-    sha1 = "f000e66980c2c3a40b6a6fd40a0bd0554fcb0424";
-  }
-  else throw "Platform: ${stdenv.system} not supported!";
-  
-  buildInputs = [ unzip makeWrapper ];
-  
-  buildCommand = ''
-    mkdir -p $out
-    cd $out
-    unzip $src
-    
-    # Fix shebang header for python scripts
-    
-    find . -name \*.py | while read i
-    do
-        sed -i -e "s|#!/usr/bin/env python|#!${python}/bin/python|" $i
-    done
-    
-    # Rename ugly version number
-    cd mobilesdk/*
-    cd 3.5.1.GA
-    
-    # Zip files do not support timestamps lower than 1980. We have to apply a few work-arounds to cope with that
-    # Yes, I know it's nasty :-)
-    
-    cd android
-    
-    sed -i -f ${./fixtiverify.sed} builder.py
-    sed -i -f ${./fixtiprofiler.sed} builder.py
-    sed -i -f ${./fixso.sed} builder.py
-    sed -i -f ${./fixnativelibs.sed} builder.py
-    
-    # Patch some executables
-    
-    ${if stdenv.system == "i686-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux.so.2 titanium_prep.linux32
-      ''
-      else if stdenv.system == "x86_64-linux" then
-      ''
-        patchelf --set-interpreter ${stdenv.cc.libc.out}/lib/ld-linux-x86-64.so.2 titanium_prep.linux64
-      ''
-      else ""}
-    
-    # Wrap builder script
-    
-    mv builder.py .builder.py
-    cat > builder.py <<EOF
-    #!${python}/bin/python
-    
-    import os, sys
-    
-    os.environ['PYTHONPATH'] = '$(echo ${python.modules.sqlite3}/lib/python*/site-packages)'
-    os.environ['JAVA_HOME'] = '${jdk.home}'
-    
-    os.execv('$(pwd)/.builder.py', sys.argv)
-    EOF
-    
-    chmod +x builder.py
-    
-  '' + stdenv.lib.optionalString (stdenv.system == "x86_64-darwin") ''
-    # 'ditto' utility is needed to copy stuff to the Xcode organizer. Dirty, but this allows it to work.
-    sed -i -e "s|ditto|/usr/bin/ditto|g" $out/mobilesdk/osx/*/iphone/builder.py
-    
-    sed -i -e "s|--xcode|--xcode '+process.env['NIX_TITANIUM_WORKAROUND']+'|" $out/mobilesdk/osx/*/iphone/cli/commands/_build.js
-  '';
-}
diff --git a/pkgs/development/mobile/titaniumenv/titaniumsdk-5.1.nix b/pkgs/development/mobile/titaniumenv/titaniumsdk-5.1.nix
new file mode 100644
index 00000000000..670e55e0f30
--- /dev/null
+++ b/pkgs/development/mobile/titaniumenv/titaniumsdk-5.1.nix
@@ -0,0 +1,42 @@
+{stdenv, fetchurl, unzip, makeWrapper, python, jdk}:
+
+stdenv.mkDerivation {
+  name = "mobilesdk-5.1.2.GA";
+  src = if (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux") then fetchurl {
+    url = http://builds.appcelerator.com/mobile/5_1_X/mobilesdk-5.1.2.v20151216190036-linux.zip;
+    sha256 = "013ipqwkfqj60mn09jbbf6a9mc4pjrn0kr0ix906whzb888zz6bv";
+  }
+  else if stdenv.system == "x86_64-darwin" then fetchurl {
+    url = http://builds.appcelerator.com/mobile/5_1_X/mobilesdk-5.1.2.v20151216190036-osx.zip;
+    sha256 = "1ylwh7zxa5yfyckzn3a9zc4cmh8gdndgb3jyr61s3j7zb1whn9ww";
+  }
+  else throw "Platform: ${stdenv.system} not supported!";
+  
+  buildInputs = [ unzip makeWrapper ];
+  
+  buildCommand = ''
+    mkdir -p $out
+    cd $out
+    (yes y | unzip $src) || true
+    
+    # Rename ugly version number
+    cd mobilesdk/*
+    mv * 5.1.2.GA
+    cd *
+    
+    # Hack to make dx.jar work with new build-tools
+    sed -i -e "s|path.join(dir, 'platform-tools', 'lib', 'dx.jar')|path.join(dir, 'build-tools', 'android-6.0', 'lib', 'dx.jar')|" $out/mobilesdk/*/*/node_modules/titanium-sdk/lib/android.js
+    
+    # Patch some executables
+    
+    ${if stdenv.system == "i686-linux" then
+      ''
+        patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux.so.2 android/titanium_prep.linux32
+      ''
+      else if stdenv.system == "x86_64-linux" then
+      ''
+        patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux-x86-64.so.2 android/titanium_prep.linux64
+      ''
+      else ""}
+  '';
+}
diff --git a/pkgs/development/mobile/xcodeenv/build-app.nix b/pkgs/development/mobile/xcodeenv/build-app.nix
index 6af32ba4198..b2e6f84bb00 100644
--- a/pkgs/development/mobile/xcodeenv/build-app.nix
+++ b/pkgs/development/mobile/xcodeenv/build-app.nix
@@ -37,7 +37,7 @@ let
     
   _arch = if arch == null
     then
-      if release then "armv7" else "i386"
+      if release then "armv7" else "x86_64"
     else arch;
 
   _sdk = if sdk == null
@@ -83,7 +83,7 @@ stdenv.mkDerivation {
       ''}
 
     # Do the building
-    xcodebuild -target ${_target} -configuration ${_configuration} ${stdenv.lib.optionalString (scheme != null) "-scheme ${scheme}"} -sdk ${_sdk} -arch ${_arch} ONLY_ACTIVE_ARCH=NO CONFIGURATION_TEMP_DIR=$TMPDIR CONFIGURATION_BUILD_DIR=$out ${if generateXCArchive then "archive" else ""} ${xcodeFlags} ${if release then ''"CODE_SIGN_IDENTITY=${codeSignIdentity}" PROVISIONING_PROFILE=$PROVISIONING_PROFILE OTHER_CODE_SIGN_FLAGS="--keychain $HOME/Library/Keychains/$keychainName"'' else ""}
+    xcodebuild -target ${_target} -configuration ${_configuration} ${stdenv.lib.optionalString (scheme != null) "-scheme ${scheme}"} -sdk ${_sdk} -arch ${_arch} ONLY_ACTIVE_ARCH=NO VALID_ARCHS="${_arch}" CONFIGURATION_TEMP_DIR=$TMPDIR CONFIGURATION_BUILD_DIR=$out ${if generateXCArchive then "archive" else ""} ${xcodeFlags} ${if release then ''"CODE_SIGN_IDENTITY=${codeSignIdentity}" PROVISIONING_PROFILE=$PROVISIONING_PROFILE OTHER_CODE_SIGN_FLAGS="--keychain $HOME/Library/Keychains/$keychainName"'' else ""}
     
     ${stdenv.lib.optionalString release ''
       ${stdenv.lib.optionalString generateIPA ''
diff --git a/pkgs/development/mobile/xcodeenv/default.nix b/pkgs/development/mobile/xcodeenv/default.nix
index d1647324865..d7e35142be4 100644
--- a/pkgs/development/mobile/xcodeenv/default.nix
+++ b/pkgs/development/mobile/xcodeenv/default.nix
@@ -1,4 +1,4 @@
-{stdenv, version ? "6.1.1", xcodeBaseDir ? "/Applications/Xcode.app"}:
+{stdenv, version ? "7.2", xcodeBaseDir ? "/Applications/Xcode.app"}:
 
 rec {
   xcodewrapper = import ./xcodewrapper.nix {
diff --git a/pkgs/development/mobile/xcodeenv/simulate-app.nix b/pkgs/development/mobile/xcodeenv/simulate-app.nix
index 645bcd69da0..ecfdbe2a6e3 100644
--- a/pkgs/development/mobile/xcodeenv/simulate-app.nix
+++ b/pkgs/development/mobile/xcodeenv/simulate-app.nix
@@ -21,7 +21,7 @@ stdenv.mkDerivation {
     fi
     
     # Open the simulator instance
-    open -a "$(readlink "${xcodewrapper}/bin/iOS Simulator")" --args -CurrentDeviceUDID $udid
+    open -a "$(readlink "${xcodewrapper}/bin/Simulator")" --args -CurrentDeviceUDID $udid
     
     # Copy the app and restore the write permissions
     appTmpDir=$(mktemp -d -t appTmpDir)
diff --git a/pkgs/development/mobile/xcodeenv/xcodewrapper.nix b/pkgs/development/mobile/xcodeenv/xcodewrapper.nix
index 4be204d5dc5..26b0197b2e1 100644
--- a/pkgs/development/mobile/xcodeenv/xcodewrapper.nix
+++ b/pkgs/development/mobile/xcodeenv/xcodewrapper.nix
@@ -10,7 +10,7 @@ stdenv.mkDerivation {
     ln -s /usr/bin/codesign
     ln -s "${xcodeBaseDir}/Contents/Developer/usr/bin/xcodebuild"
     ln -s "${xcodeBaseDir}/Contents/Developer/usr/bin/xcrun"
-    ln -s "${xcodeBaseDir}/Contents/Developer/Applications/iOS Simulator.app/Contents/MacOS/iOS Simulator"
+    ln -s "${xcodeBaseDir}/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator"
 
     cd ..
     ln -s "${xcodeBaseDir}/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs"