summary refs log tree commit diff
path: root/pkgs/top-level/node-packages.nix
blob: 5719967c4c5c7dced97eae9ba2b030e8ffe0457c (plain) (blame)
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
{ pkgs, stdenv, nodejs, fetchurl, neededNatives, self }:

let
  inherit (self) buildNodePackage patchLatest;

  importGeneratedPackages = generated: nativeDeps: self:
    let
      nativeDepsList = { name, spec, ... }:
        let
          nameOr = if builtins.hasAttr name nativeDeps
            then builtins.getAttr name nativeDeps
            else {};
          depsOr = if builtins.hasAttr spec nameOr
            then builtins.getAttr spec nameOr
            else [];
        in depsOr;
      all = pkgs.lib.fold (pkg: { top-level, full }: {
        top-level = top-level ++ pkgs.lib.optional pkg.topLevel {
          name = pkg.name;
          value = builtins.getAttr pkg.spec (builtins.getAttr pkg.name self.full);
        };
        full = full // builtins.listToAttrs [ {
          inherit (pkg) name;
          value = (if builtins.hasAttr pkg.name full
            then builtins.getAttr pkg.name full
            else {}
          ) // builtins.listToAttrs [ {
            name = pkg.spec;
            value = pkgs.lib.makeOverridable buildNodePackage {
              name = "${pkg.name}-${pkg.version}";
              src = (if pkg.patchLatest then patchLatest else fetchurl) {
                url = pkg.tarball;
                sha1 = pkg.sha1 or "";
                sha256 = pkg.sha256 or "";
              };
              deps = map (dep: builtins.getAttr dep.spec (builtins.getAttr dep.name self.full)) pkg.dependencies;
              buildInputs = nativeDepsList pkg;
            };
          } ];
        } ];
      } ) { top-level = []; full = {}; } generated;
    in builtins.listToAttrs all.top-level // { inherit (all) full; };
in {
  inherit importGeneratedPackages;

  nativeDeps = {
    "node-expat"."*" = [ pkgs.expat ];
    "rbytes"."0.0.2" = [ pkgs.openssl ];
  };

  buildNodePackage = import ../development/web/nodejs/build-node-package.nix {
    inherit stdenv nodejs neededNatives;
    inherit (pkgs) runCommand;
  };

  patchLatest = srcAttrs:
    let src = fetchurl srcAttrs; in pkgs.runCommand src.name {} ''
      mkdir unpack
      cd unpack
      tar xf ${src}
      mv */ package 2>/dev/null || true
      sed -i -e "s/: \"latest\"/: \"*\"/" package/package.json
      tar cf $out *
    '';

  /* Put manual packages below here (ideally eventually managed by npm2nix */
} // importGeneratedPackages (import ./node-packages-generated.nix) self.nativeDeps self