aboutsummaryrefslogtreecommitdiff
path: root/npmPackages/buildNpmPackage.nix
blob: c2d1af4e6a1493c160f484f3545a2008f7720e2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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
  '';
}