From 0215671c6aab24e1885074761f44c502f0bb00e2 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Fri, 27 Sep 2019 16:05:42 +0200 Subject: Initial PoC --- npmPackages/buildNpmPackage.nix | 93 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 npmPackages/buildNpmPackage.nix (limited to 'npmPackages/buildNpmPackage.nix') diff --git a/npmPackages/buildNpmPackage.nix b/npmPackages/buildNpmPackage.nix new file mode 100644 index 0000000..c2d1af4 --- /dev/null +++ b/npmPackages/buildNpmPackage.nix @@ -0,0 +1,93 @@ +{stdenv, lib, nodejs, writeText}: + +{ pname +, version +, src +, npmInputs ? [] # NPM packages used to resolve dependencies +, buildInputs ? [] # Other build inputs +, nativeBuildInputs ? [] +, patches ? [] +, files ? [] # override "files" in package.json +, buildPhase ? "npm --if-present run build" +, checkPhase ? "npm test" +, doCheck ? true +, jailbreak ? false # Ignore version constraints of the dependencies +}: + +let + + name = "nodejs-${nodejs.version}-${pname}-${version}"; + + scripts = "${./_scripts}"; + +in +stdenv.mkDerivation { + inherit + buildInputs buildPhase checkPhase doCheck name patches src + ; + + outputs = [ "out" "pack" ]; + + nativeBuildInputs = nativeBuildInputs ++ [ nodejs ]; + + configurePhase = '' + export HOME=$PWD + + cat << 'NPMRC' > $HOME/.npmrc + audit = false + heading = ${name} + loglevel = verbose + metrics-registry = http://localhost + offline = true + optional = false + package-lock = false + registry = http://localhost + save = false + script-shell = ${stdenv.shell} + send-metrics = false + update-notifier = false + NPMRC + + node ${scripts}/resolve.js \ + ${lib.optionalString jailbreak "--jailbreak"} \ + ${toString npmInputs} < package.json > package.json.resolved + mv package.json.resolved package.json + + npm --nodedir=${nodejs} --ignore-scripts install + + ''; + + installPhase = '' + # remove things that are not needed any more or not needed with Nix: + node ${scripts}/strip.js < package.json > package.json.stripped + mv package.json.stripped package.json + + ${lib.optionalString (files != []) '' + node ${scripts}/files.js ${lib.concatMapStringsSep " " (f: "'${f}'") files} < package.json > package.json.files + mv package.json.files package.json + ''} + + cp package.json package.json.resolved + + node ${scripts}/pindeps.js < package.json > package.json.pinned + mv package.json.pinned package.json + + npm pack + + mkdir -p $pack + cp ${pname}-${version}.tgz $pack/ + + mkdir -p $out + tar xf ${pname}-${version}.tgz --strip-components=1 -C $out + mv package.json.resolved $out/package.json + + # Link runtime depdendencies, if any, to node_modules: + cd $out + npm install + + # Finally, strip info about runtime dependencies, + # so that NPM will not complain about missed or extraneous dependencies: + node ${scripts}/strip.js --strip-dependencies < package.json > package.json.stripped + mv package.json.stripped package.json + ''; +} -- cgit v1.2.3