From e63dafe0f7e0fa8b538eaf0add4741e67767776a Mon Sep 17 00:00:00 2001 From: Erik Arvstedt Date: Sun, 21 Aug 2022 14:41:36 +0200 Subject: [PATCH] pkgs: add `fetch-node-modules` --- flake.nix | 8 ++- pkgs/build-support/fetch-node-modules.nix | 74 +++++++++++++++++++++++ pkgs/default.nix | 2 + 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 pkgs/build-support/fetch-node-modules.nix diff --git a/flake.nix b/flake.nix index 116bdcc..2ad95c0 100644 --- a/flake.nix +++ b/flake.nix @@ -73,7 +73,13 @@ nbPkgs = self.lib.mkNbPkgs { inherit system pkgs; }; in rec { packages = flake-utils.lib.flattenTree (removeAttrs nbPkgs [ - "pinned" "modulesPkgs" "nixops19_09" "krops" "generate-secrets" "netns-exec" + "fetchNodeModules" + "krops" + "modulesPkgs" + "netns-exec" + "nixops19_09" + "pinned" + "generate-secrets" ]) // { inherit (import ./examples/qemu-vm/minimal-vm.nix self pkgs system) # A simple demo VM. diff --git a/pkgs/build-support/fetch-node-modules.nix b/pkgs/build-support/fetch-node-modules.nix new file mode 100644 index 0000000..78899da --- /dev/null +++ b/pkgs/build-support/fetch-node-modules.nix @@ -0,0 +1,74 @@ +# This is a modified version of +# https://github.com/NixOS/nixpkgs/pull/128749 + +{ lib, stdenvNoCC, makeWrapper, nodejs }: + +{ src +, hash ? "" +, runScripts ? false +, preferLocalBuild ? true +, npmFlags ? "" +, ... +} @ args: +stdenvNoCC.mkDerivation ({ + inherit src preferLocalBuild; + + name = "${src.name}-node_modules"; + nativeBuildInputs = [ + makeWrapper + (if args ? nodejs then args.nodejs else nodejs) + ]; + + outputHashMode = "recursive"; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars; + + phases = "unpackPhase patchPhase buildPhase installPhase"; + + buildPhase = '' + runHook preBuild + + if [[ ! -f package.json ]]; then + echo "Error: file `package.json` doesn't exist" + exit 1 + fi + if [[ ! -f package-lock.json ]]; then + echo "Error: file `package-lock.json` doesn't exist" + exit 1 + fi + + export SOURCE_DATE_EPOCH=1 + export npm_config_cache=/tmp + NPM_FLAGS="--omit=dev --omit=optional --no-update-notifier $npmFlags" + # Scripts may result in non-deterministic behavior. + # Some packages (e.g., Puppeteer) use postinstall scripts to download extra data. + if [[ ! $runScripts ]]; then + NPM_FLAGS+=" --ignore-scripts" + fi + + echo "Running npm ci $NPM_FLAGS" + npm ci $NPM_FLAGS + + cp package.json \ + package-lock.json node_modules/ + rm -f node_modules/.package-lock.json + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/lib + cp -r node_modules $out/lib + + runHook postInstall + ''; +} // ( + if hash == "" then { + outputHashAlgo = "sha256"; + outputHash = ""; + } else { + outputHash = hash; + } +) // (builtins.removeAttrs args [ "hash" ])) diff --git a/pkgs/default.nix b/pkgs/default.nix index 97d40b8..2ed7a58 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -25,6 +25,8 @@ let self = { packageOverrides = import ./python-packages self; }).pkgs; + fetchNodeModules = pkgs.callPackage ./build-support/fetch-node-modules.nix { }; + # Fix clightning build by using python package mistune 0.8.4, which is a # strict requirement. This version is affected by CVE-2022-34749, but this # is irrelevant in this context.