summary refs log tree commit diff
path: root/flake.nix
blob: 0163c96289e984ba0775c92276cb56924986fe3c (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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
{
  inputs = {
    utils.url = "github:numtide/flake-utils";
    nixpkgs.url = "github:NixOS/nixpkgs/master";
    nix-filter.url = "github:numtide/nix-filter";
  };

  outputs = {
    self,
    nixpkgs,
    utils,
    nix-filter,
  }:
    utils.lib.eachDefaultSystem
    (system: let
      pkgs = import nixpkgs {
        inherit system;
      };

      filter = nix-filter.lib;

      nodejs = pkgs.nodejs-18_x;

      src = filter {
        root = ./.;
        include = [
          ./package.json
          ./package-lock.json
        ];
      };

      packageLock = builtins.fromJSON(builtins.readFile (src + "/package-lock.json"));

      deps = builtins.attrValues (removeAttrs packageLock.packages [ "" ])
        ++ builtins.attrValues (removeAttrs (packageLock.dependencies or {} ) [ "" ])
      ;
      tarballs = map (p: pkgs.fetchurl { url = p.resolved; hash = p.integrity; }) deps;
      tarballsFile = pkgs.writeTextFile {
        name = "tarballs";
        text = builtins.concatStringsSep "\n" tarballs;
      };

      tempestdev_modules = pkgs.stdenv.mkDerivation {
        inherit src;

        name = "node_modules";

        buildInputs = [ nodejs ];

        buildPhase = ''
          export HOME=$PWD/.home
          export npm_config_cache=$PWD/.npm

          while read package
          do
            echo "caching $(echo $package | sed 's/\/nix\/store\/[^-]*-//')"
            npm cache add "$package"
          done <${tarballsFile}

          ${nodejs}/bin/npm ci
        '';

        installPhase = ''
          mkdir $out
          mv node_modules $out/node_modules
        '';
      };
    in {
      packages = {

        default = pkgs.stdenv.mkDerivation {
          name = "tempest.dev";

          src = filter {
            root = ./.;
            exclude = [
              ./.next
              ./node_modules
            ];
          };

          nativeBuildInputs = [ nodejs ];

          configurePhase = ''
            ln -sf ${tempestdev_modules}/node_modules node_modules
            export HOME=$TMP
          '';

          buildPhase = ''
            npm run build
          '';

          installPhase = ''
            mv out $out
          '';
        };
      };
    }) // {
      nixosModule = {config, lib, pkgs, ...}:
        with lib;
        let cfg = config.ashe.services."tempest.dev";
            pkg = self.packages.${pkgs.system}.default;


        in {
          options.ashe.services."tempest.dev" = {
            enable = mkEnableOption "Enables the tempest.dev HTTP service";

            domain = mkOption rec {
              type = types.str;
              default = "tempest.dev";
              example = default;
              description = "The domain name for tempest.dev";
            };
          };

          config = mkIf cfg.enable {
            services.nginx.virtualHosts.${cfg.domain} = {
              locations."/" = {
                root = "${pkg}";
              };
              forceSSL = true;
              enableACME = true;
            };
          };
        };
    };
}