Skip to content

Commit

Permalink
nodePackages: regenerate with node2nix 1.5.0 + add basic Node.js 8.x …
Browse files Browse the repository at this point in the history
…package set
  • Loading branch information
svanderburg committed Dec 19, 2017
1 parent 0bb77b8 commit fded180
Show file tree
Hide file tree
Showing 11 changed files with 12,309 additions and 8,462 deletions.
2 changes: 1 addition & 1 deletion pkgs/development/node-packages/composition-v4.nix
@@ -1,4 +1,4 @@
# This file has been generated by node2nix 1.4.0. Do not edit!
# This file has been generated by node2nix 1.5.0. Do not edit!

{pkgs ? import <nixpkgs> {
inherit system;
Expand Down
2 changes: 1 addition & 1 deletion pkgs/development/node-packages/composition-v6.nix
@@ -1,4 +1,4 @@
# This file has been generated by node2nix 1.4.0. Do not edit!
# This file has been generated by node2nix 1.5.0. Do not edit!

{pkgs ? import <nixpkgs> {
inherit system;
Expand Down
16 changes: 16 additions & 0 deletions pkgs/development/node-packages/composition-v8.nix
@@ -0,0 +1,16 @@
# This file has been generated by node2nix 1.5.0. Do not edit!

{pkgs ? import <nixpkgs> {
inherit system;
}, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-8_x"}:

let
nodeEnv = import ./node-env.nix {
inherit (pkgs) stdenv python2 utillinux runCommand writeTextFile;
inherit nodejs;
};
in
import ./node-packages-v8.nix {
inherit (pkgs) fetchurl fetchgit;
inherit nodeEnv;
}
71 changes: 71 additions & 0 deletions pkgs/development/node-packages/default-v8.nix
@@ -0,0 +1,71 @@
{pkgs, system, nodejs, stdenv}:

let
nodePackages = import ./composition-v8.nix {
inherit pkgs system nodejs;
};
in
nodePackages // {
dnschain = nodePackages.dnschain.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ pkgs.makeWrapper nodePackages.coffee-script ];
postInstall = ''
wrapProgram $out/bin/dnschain --suffix PATH : ${pkgs.openssl.bin}/bin
'';
});

node-inspector = nodePackages.node-inspector.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ nodePackages.node-pre-gyp ];
});

phantomjs = nodePackages.phantomjs.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ pkgs.phantomjs2 ];
});

webdrvr = nodePackages.webdrvr.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ pkgs.phantomjs ];

preRebuild = ''
mkdir $TMPDIR/webdrvr
ln -s ${pkgs.fetchurl {
url = "https://selenium-release.storage.googleapis.com/2.43/selenium-server-standalone-2.43.1.jar";
sha1 = "ef1b5f8ae9c99332f99ba8794988a1d5b974d27b";
}} $TMPDIR/webdrvr/selenium-server-standalone-2.43.1.jar
ln -s ${pkgs.fetchurl {
url = "http://chromedriver.storage.googleapis.com/2.10/chromedriver_linux64.zip";
sha1 = "26220f7e43ee3c0d714860db61c4d0ecc9bb3d89";
}} $TMPDIR/webdrvr/chromedriver_linux64.zip
'';

dontNpmInstall = true; # We face an error with underscore not found, but the package will work fine if we ignore this.
});

npm2nix = nodePackages."npm2nix-git://github.com/NixOS/npm2nix.git#5.12.0".override {
postInstall = "npm run-script prepublish";
};

bower2nix = nodePackages.bower2nix.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ pkgs.makeWrapper ];
postInstall = ''
for prog in bower2nix fetch-bower; do
wrapProgram "$out/bin/$prog" --prefix PATH : ${stdenv.lib.makeBinPath [ pkgs.git pkgs.nix ]}
done
'';
});

ios-deploy = nodePackages.ios-deploy.override (oldAttrs: {
preRebuild = ''
tmp=$(mktemp -d)
ln -s /usr/bin/xcodebuild $tmp
export PATH="$PATH:$tmp"
'';
});

fast-cli = nodePackages."fast-cli-1.x".override (oldAttrs: {
preRebuild = ''
# Simply ignore the phantomjs --version check. It seems to need a display but it is safe to ignore
sed -i -e "s|console.error('Error verifying phantomjs, continuing', err)|console.error('Error verifying phantomjs, continuing', err); return true;|" node_modules/phantomjs-prebuilt/lib/util.js
'';
buildInputs = oldAttrs.buildInputs ++ [ pkgs.phantomjs2 ];
});
}
1 change: 1 addition & 0 deletions pkgs/development/node-packages/generate.sh
Expand Up @@ -4,3 +4,4 @@
rm -f node-env.nix
node2nix -i node-packages-v4.json -o node-packages-v4.nix -c composition-v4.nix
node2nix -6 -i node-packages-v6.json -o node-packages-v6.nix -c composition-v6.nix
node2nix -8 -i node-packages-v8.json -o node-packages-v8.nix -c composition-v8.nix
158 changes: 152 additions & 6 deletions pkgs/development/node-packages/node-env.nix
Expand Up @@ -194,9 +194,126 @@ let
mv node-* $out
'';

# Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
addIntegrityFieldsScript = writeTextFile {
name = "addintegrityfields.js";
text = ''
var fs = require('fs');
var path = require('path');
function augmentDependencies(baseDir, dependencies) {
for(var dependencyName in dependencies) {
var dependency = dependencies[dependencyName];
// Open package.json and augment metadata fields
var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
var packageJSONPath = path.join(packageJSONDir, "package.json");
if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
console.log("Adding metadata fields to: "+packageJSONPath);
var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
if(dependency.integrity) {
packageObj["_integrity"] = dependency.integrity;
} else {
packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
}
packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
}
// Augment transitive dependencies
if(dependency.dependencies !== undefined) {
augmentDependencies(packageJSONDir, dependency.dependencies);
}
}
}
if(fs.existsSync("./package-lock.json")) {
var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
if(packageLock.lockfileVersion !== 1) {
process.stderr.write("Sorry, I only understand lock file version 1!\n");
process.exit(1);
}
if(packageLock.dependencies !== undefined) {
augmentDependencies(".", packageLock.dependencies);
}
}
'';
};

# Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
reconstructPackageLock = writeTextFile {
name = "addintegrityfields.js";
text = ''
var fs = require('fs');
var path = require('path');
var packageObj = JSON.parse(fs.readFileSync("package.json"));
var lockObj = {
name: packageObj.name,
version: packageObj.version,
lockfileVersion: 1,
requires: true,
dependencies: {}
};
function augmentPackageJSON(filePath, dependencies) {
var packageJSON = path.join(filePath, "package.json");
if(fs.existsSync(packageJSON)) {
var packageObj = JSON.parse(fs.readFileSync(packageJSON));
dependencies[packageObj.name] = {
version: packageObj.version,
integrity: "sha1-000000000000000000000000000=",
dependencies: {}
};
processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies);
}
}
function processDependencies(dir, dependencies) {
if(fs.existsSync(dir)) {
var files = fs.readdirSync(dir);
files.forEach(function(entry) {
var filePath = path.join(dir, entry);
var stats = fs.statSync(filePath);
if(stats.isDirectory()) {
if(entry.substr(0, 1) == "@") {
// When we encounter a namespace folder, augment all packages belonging to the scope
var pkgFiles = fs.readdirSync(filePath);
pkgFiles.forEach(function(entry) {
if(stats.isDirectory()) {
var pkgFilePath = path.join(filePath, entry);
augmentPackageJSON(pkgFilePath, dependencies);
}
});
} else {
augmentPackageJSON(filePath, dependencies);
}
}
});
}
}
processDependencies("node_modules", lockObj.dependencies);
fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
'';
};

# Builds and composes an NPM package including all its dependencies
buildNodePackage = { name, packageName, version, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, preRebuild ? "", ... }@args:
buildNodePackage = { name, packageName, version, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, bypassCache ? false, preRebuild ? "", ... }@args:

let
forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
in
stdenv.lib.makeOverridable stdenv.mkDerivation (builtins.removeAttrs args [ "dependencies" ] // {
name = "node-${name}-${version}";
buildInputs = [ tarWrapper python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ args.buildInputs or [];
Expand Down Expand Up @@ -242,14 +359,25 @@ let
export HOME=$TMPDIR
cd "${packageName}"
runHook preRebuild
npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
${stdenv.lib.optionalString bypassCache ''
if [ ! -f package-lock.json ]
then
echo "No package-lock.json file found, reconstructing..."
node ${reconstructPackageLock}
fi
node ${addIntegrityFieldsScript}
''}
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
if [ "$dontNpmInstall" != "1" ]
then
# NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
rm -f npm-shrinkwrap.json
npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
fi
# Create symlink to the deployed executable folder, if applicable
Expand Down Expand Up @@ -278,8 +406,10 @@ let
});

# Builds a development shell
buildNodeShell = { name, packageName, version, src, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, ... }@args:
buildNodeShell = { name, packageName, version, src, dependencies ? [], production ? true, npmFlags ? "", dontNpmInstall ? false, bypassCache ? false, ... }@args:
let
forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";

nodeDependencies = stdenv.mkDerivation {
name = "node-dependencies-${name}-${version}";

Expand All @@ -299,6 +429,12 @@ let
# Create fake package.json to make the npm commands work properly
cp ${src}/package.json .
chmod 644 package.json
${stdenv.lib.optionalString bypassCache ''
if [ -f ${src}/package-lock.json ]
then
cp ${src}/package-lock.json .
fi
''}
# Pinpoint the versions of all dependencies to the ones that are actually being used
echo "pinpointing versions of dependencies..."
Expand All @@ -312,13 +448,23 @@ let
export HOME=$PWD
npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
${stdenv.lib.optionalString bypassCache ''
if [ ! -f package-lock.json ]
then
echo "No package-lock.json file found, reconstructing..."
node ${reconstructPackageLock}
fi
node ${addIntegrityFieldsScript}
''}
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
${stdenv.lib.optionalString (!dontNpmInstall) ''
# NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
rm -f npm-shrinkwrap.json
npm --registry http://www.example.com --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
''}
cd ..
Expand Down

0 comments on commit fded180

Please sign in to comment.