Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
1{
2 lib,
3 beamPackages,
4 buildNpmPackage,
5 rustPlatform,
6 fetchFromGitHub,
7 nodejs,
8 runCommand,
9 nixosTests,
10 npm-lockfile-fix,
11 nix-update-script,
12 brotli,
13 tailwindcss_3,
14 esbuild,
15 ...
16}:
17
18let
19 pname = "plausible";
20 version = "2.1.5";
21 mixEnv = "ce";
22
23 src = fetchFromGitHub {
24 owner = "plausible";
25 repo = "analytics";
26 rev = "v${version}";
27 hash = "sha256-4gwK/AxzhsU0vgvKgIXrOyQLCgZMeZyKjj7PWbUmJ+8=";
28 postFetch = ''
29 ${lib.getExe npm-lockfile-fix} $out/assets/package-lock.json
30 sed -ie '
31 /defp deps do/ {
32 n
33 /\[/ a\
34 \{:rustler, ">= 0.0.0", optional: true \},
35 }
36 ' $out/mix.exs
37 cat >> $out/config/config.exs <<EOF
38 config :mjml, Mjml.Native,
39 crate: :mjml_nif,
40 skip_compilation?: true
41 EOF
42 '';
43 };
44
45 assets = buildNpmPackage {
46 pname = "${pname}-assets";
47 inherit version;
48 src = "${src}/assets";
49 npmDepsHash = "sha256-Rf1+G9F/CMK09KEh022vHe02FADJtARKX4QEVbmvSqk=";
50 dontNpmBuild = true;
51 installPhase = ''
52 runHook preInstall
53 cp -r . "$out"
54 runHook postInstall
55 '';
56 };
57
58 tracker = buildNpmPackage {
59 pname = "${pname}-tracker";
60 inherit version;
61 src = "${src}/tracker";
62 npmDepsHash = "sha256-ng0YpBZc0vcg5Bsr1LmgXtzNCtNV6hJIgLt3m3yRdh4=";
63 dontNpmBuild = true;
64 installPhase = ''
65 runHook preInstall
66 cp -r . "$out"
67 runHook postInstall
68 '';
69 };
70
71 mixFodDeps = beamPackages.fetchMixDeps {
72 inherit
73 pname
74 version
75 src
76 mixEnv
77 ;
78 hash = "sha256-edQ8byeV0WUaYDYMnmrstC6L2jztidR/JikGZLpX3WE=";
79 };
80
81 mjmlNif = rustPlatform.buildRustPackage {
82 pname = "mjml-native";
83 version = "";
84 src = "${mixFodDeps}/mjml/native/mjml_nif";
85
86 cargoHash = "sha256-zDWOik65PWAMpIDDcG+DibprPVW/k+Q83+fjFI5vWaY=";
87 doCheck = false;
88
89 env = {
90 RUSTLER_PRECOMPILED_FORCE_BUILD_ALL = "true";
91 RUSTLER_PRECOMPILED_GLOBAL_CACHE_PATH = "unused-but-required";
92 };
93 };
94
95 patchedMixFodDeps =
96 runCommand mixFodDeps.name
97 {
98 inherit (mixFodDeps) hash;
99 }
100 ''
101 mkdir $out
102 cp -r --no-preserve=mode ${mixFodDeps}/. $out
103
104 mkdir -p $out/mjml/priv/native
105 for lib in ${mjmlNif}/lib/*
106 do
107 # normalies suffix to .so, otherswise build would fail on darwin
108 file=''${lib##*/}
109 base=''${file%.*}
110 ln -s "$lib" $out/mjml/priv/native/$base.so
111 done
112 '';
113
114in
115beamPackages.mixRelease rec {
116 inherit
117 pname
118 version
119 src
120 mixEnv
121 ;
122
123 nativeBuildInputs = [
124 nodejs
125 brotli
126 ];
127
128 mixFodDeps = patchedMixFodDeps;
129
130 passthru = {
131 tests = {
132 inherit (nixosTests) plausible;
133 };
134 updateScript = nix-update-script {
135 extraArgs = [
136 "-s"
137 "tracker"
138 "-s"
139 "assets"
140 "-s"
141 "mjmlNif"
142 ];
143 };
144 inherit
145 assets
146 tracker
147 mjmlNif
148 ;
149 };
150
151 env = {
152 APP_VERSION = version;
153 RUSTLER_PRECOMPILED_FORCE_BUILD_ALL = "true";
154 RUSTLER_PRECOMPILED_GLOBAL_CACHE_PATH = "unused-but-required";
155 };
156
157 preBuild = ''
158 rm -r assets tracker
159 cp --no-preserve=mode -r ${assets} assets
160 cp -r ${tracker} tracker
161
162 cat >> config/config.exs <<EOF
163 config :tailwind, path: "${lib.getExe tailwindcss_3}"
164 config :esbuild, path: "${lib.getExe esbuild}"
165 EOF
166 '';
167
168 postBuild = ''
169 npm run deploy --prefix ./tracker
170
171 # for external task you need a workaround for the no deps check flag
172 # https://github.com/phoenixframework/phoenix/issues/2690
173 mix do deps.loadpaths --no-deps-check, assets.deploy
174 mix do deps.loadpaths --no-deps-check, phx.digest priv/static
175 '';
176
177 meta = with lib; {
178 license = licenses.agpl3Plus;
179 homepage = "https://plausible.io/";
180 changelog = "https://github.com/plausible/analytics/blob/${src.rev}/CHANGELOG.md";
181 description = "Simple, open-source, lightweight (< 1 KB) and privacy-friendly web analytics alternative to Google Analytics";
182 mainProgram = "plausible";
183 teams = [ teams.cyberus ];
184 platforms = platforms.unix;
185 };
186}