summary refs log tree commit diff
path: root/pkgs/development/web/nodejs/build-node-package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/web/nodejs/build-node-package.nix')
-rw-r--r--pkgs/development/web/nodejs/build-node-package.nix50
1 files changed, 50 insertions, 0 deletions
diff --git a/pkgs/development/web/nodejs/build-node-package.nix b/pkgs/development/web/nodejs/build-node-package.nix
new file mode 100644
index 000000000000..95d10db167f1
--- /dev/null
+++ b/pkgs/development/web/nodejs/build-node-package.nix
@@ -0,0 +1,50 @@
+{ stdenv, runCommand, nodejs, neededNatives}:
+
+args @ { src, deps ? [], flags ? [], ... }:
+
+with stdenv.lib;
+
+let npmFlags = concatStringsSep " " (map (v: "--${v}") flags);
+    sources = runCommand "node-sources" {} ''
+      tar xf ${nodejs.src}
+      mv *node* $out
+    '';
+
+in
+stdenv.mkDerivation ({
+  unpackPhase = "true";
+
+  configurePhase = ''
+    runHook preConfigure
+    mkdir node_modules
+    ${stdenv.lib.concatStrings (map (dep: ''
+      ln -sv ${dep}/node_modules/${(builtins.parseDrvName dep.name).name} node_modules/
+    '') deps)}
+    export HOME=$(pwd)
+    runHook postConfigure
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+    ${nodejs}/bin/npm --registry http://www.example.com --nodedir=${sources} install ${src} ${npmFlags}
+    runHook postBuild
+  '';
+
+  buildNativeInputs = neededNatives;
+
+  installPhase = ''
+    runHook preInstall
+    mkdir $out
+    mv node_modules $out
+    if [ -d "$out/node_modules/.bin" ]; then
+      ln -sv node_modules/.bin $out/bin
+      find -L $out/node_modules/.bin/* -type f -print0 | \
+        xargs -0 sed --follow-symlinks -i 's@#!/usr/bin/env node@#!${nodejs}/bin/node@'
+    fi
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    find $out -type f -print0 | xargs -0 sed -i 's|${src}|${src.name}|g'
+  '';
+} // args)