1{ pkgs, nodejs, stdenv, applyPatches, fetchFromGitHub, fetchpatch, fetchurl }:
2
3let
4 inherit (pkgs) lib;
5 since = (version: pkgs.lib.versionAtLeast nodejs.version version);
6 before = (version: pkgs.lib.versionOlder nodejs.version version);
7 super = import ./composition.nix {
8 inherit pkgs nodejs;
9 inherit (stdenv.hostPlatform) system;
10 };
11 self = super // {
12 "@angular/cli" = super."@angular/cli".override {
13 prePatch = ''
14 export NG_CLI_ANALYTICS=false
15 '';
16 };
17
18 autoprefixer = super.autoprefixer.override {
19 nativeBuildInputs = [ pkgs.makeWrapper ];
20 postInstall = ''
21 wrapProgram "$out/bin/autoprefixer" \
22 --prefix NODE_PATH : ${self.postcss}/lib/node_modules
23 '';
24 passthru.tests = {
25 simple-execution = pkgs.callPackage ./package-tests/autoprefixer.nix { inherit (self) autoprefixer; };
26 };
27 };
28
29 aws-azure-login = super.aws-azure-login.override {
30 meta.platforms = pkgs.lib.platforms.linux;
31 nativeBuildInputs = [ pkgs.makeWrapper ];
32 prePatch = ''
33 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
34 '';
35 postInstall = ''
36 wrapProgram $out/bin/aws-azure-login \
37 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium}/bin/chromium
38 '';
39 };
40
41 bower2nix = super.bower2nix.override {
42 buildInputs = [ pkgs.makeWrapper ];
43 postInstall = ''
44 for prog in bower2nix fetch-bower; do
45 wrapProgram "$out/bin/$prog" --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.git pkgs.nix ]}
46 done
47 '';
48 };
49
50 carbon-now-cli = super.carbon-now-cli.override ({
51 nativeBuildInputs = [ pkgs.makeWrapper ];
52 prePatch = ''
53 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
54 '';
55 postInstall = ''
56 wrapProgram $out/bin/carbon-now \
57 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
58 '';
59 });
60
61 deltachat-desktop = super."deltachat-desktop-../../applications/networking/instant-messengers/deltachat-desktop".override {
62 meta.broken = true; # use the top-level package instead
63 };
64
65 fast-cli = super.fast-cli.override ({
66 nativeBuildInputs = [ pkgs.makeWrapper ];
67 prePatch = ''
68 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
69 '';
70 postInstall = ''
71 wrapProgram $out/bin/fast \
72 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
73 '';
74 });
75
76 hyperspace-cli = super."@hyperspace/cli".override {
77 nativeBuildInputs = with pkgs; [
78 makeWrapper
79 libtool
80 autoconf
81 automake
82 ];
83 buildInputs = with pkgs; [
84 nodePackages.node-gyp-build
85 nodejs
86 ];
87 postInstall = ''
88 wrapProgram "$out/bin/hyp" --prefix PATH : ${
89 pkgs.lib.makeBinPath [ pkgs.nodejs ]
90 }
91 '';
92 # See: https://github.com/NixOS/nixpkgs/issues/142196
93 # [...]/@hyperspace/cli/node_modules/.bin/node-gyp-build: /usr/bin/env: bad interpreter: No such file or directory
94 meta.broken = true;
95 };
96
97 mdctl-cli = super."@medable/mdctl-cli".override {
98 nativeBuildInputs = with pkgs; with darwin.apple_sdk.frameworks; [
99 glib
100 libsecret
101 pkg-config
102 ] ++ lib.optionals stdenv.isDarwin [
103 AppKit
104 Security
105 ];
106 buildInputs = with pkgs; [
107 nodePackages.node-gyp-build
108 nodePackages.node-pre-gyp
109 nodejs
110 ];
111 };
112
113 coc-imselect = super.coc-imselect.override {
114 meta.broken = since "10";
115 };
116
117 jshint = super.jshint.override {
118 buildInputs = [ pkgs.phantomjs2 ];
119 };
120
121 dat = super.dat.override {
122 buildInputs = [ self.node-gyp-build pkgs.libtool pkgs.autoconf pkgs.automake ];
123 meta.broken = since "12";
124 };
125
126 # NOTE: this is a stub package to fetch npm dependencies for
127 # ../../applications/video/epgstation
128 epgstation = super."epgstation-../../applications/video/epgstation".override (drv: {
129 meta = drv.meta // {
130 broken = true; # not really broken, see the comment above
131 };
132 });
133
134 bitwarden-cli = super."@bitwarden/cli".override (drv: {
135 name = "bitwarden-cli-${drv.version}";
136 meta.mainProgram = "bw";
137 });
138
139 flood = super.flood.override {
140 buildInputs = [ self.node-pre-gyp ];
141 meta.mainProgram = "flood";
142 };
143
144 expo-cli = super."expo-cli".override (attrs: {
145 # The traveling-fastlane-darwin optional dependency aborts build on Linux.
146 dependencies = builtins.filter (d: d.packageName != "@expo/traveling-fastlane-${if stdenv.isLinux then "darwin" else "linux"}") attrs.dependencies;
147 });
148
149 "@electron-forge/cli" = super."@electron-forge/cli".override {
150 buildInputs = [ self.node-pre-gyp self.rimraf ];
151 };
152
153 git-ssb = super.git-ssb.override {
154 buildInputs = [ self.node-gyp-build ];
155 meta.broken = since "10";
156 };
157
158 hsd = super.hsd.override {
159 buildInputs = [ self.node-gyp-build pkgs.unbound ];
160 };
161
162 ijavascript = super.ijavascript.override (oldAttrs: {
163 preRebuild = ''
164 export NPM_CONFIG_ZMQ_EXTERNAL=true
165 '';
166 buildInputs = oldAttrs.buildInputs ++ [ self.node-gyp-build pkgs.zeromq ];
167 });
168
169 insect = super.insect.override (drv: {
170 nativeBuildInputs = drv.nativeBuildInputs or [] ++ [ pkgs.psc-package self.pulp ];
171 });
172
173 intelephense = super.intelephense.override {
174 meta.license = pkgs.lib.licenses.unfree;
175 };
176
177 jsonplaceholder = super.jsonplaceholder.override (drv: {
178 buildInputs = [ nodejs ];
179 postInstall = ''
180 exe=$out/bin/jsonplaceholder
181 mkdir -p $out/bin
182 cat >$exe <<EOF
183 #!${pkgs.runtimeShell}
184 exec -a jsonplaceholder ${nodejs}/bin/node $out/lib/node_modules/jsonplaceholder/index.js
185 EOF
186 chmod a+x $exe
187 '';
188 });
189
190 makam = super.makam.override {
191 buildInputs = [ pkgs.nodejs pkgs.makeWrapper ];
192 postFixup = ''
193 wrapProgram "$out/bin/makam" --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.nodejs ]}
194 ${
195 if stdenv.isLinux
196 then "patchelf --set-interpreter ${stdenv.glibc}/lib/ld-linux-x86-64.so.2 \"$out/lib/node_modules/makam/makam-bin-linux64\""
197 else ""
198 }
199 '';
200 };
201
202 markdownlint-cli = super.markdownlint-cli.override {
203 meta.mainProgram = "markdownlint";
204 };
205
206 node-gyp = super.node-gyp.override {
207 nativeBuildInputs = [ pkgs.makeWrapper ];
208 # Teach node-gyp to use nodejs headers locally rather that download them form https://nodejs.org.
209 # This is important when build nodejs packages in sandbox.
210 postInstall = ''
211 wrapProgram "$out/bin/node-gyp" \
212 --set npm_config_nodedir ${nodejs}
213 '';
214 };
215
216 node-inspector = super.node-inspector.override {
217 buildInputs = [ self.node-pre-gyp ];
218 meta.broken = since "10";
219 };
220
221 node2nix = super.node2nix.override {
222 buildInputs = [ pkgs.makeWrapper ];
223 # We need to apply a patch to the source, but buildNodePackage doesn't allow patches.
224 # So we pin the patched commit instead. The commit actually contains two other newer commits
225 # since the last (1.9.0) release, but actually this is a good thing since one of them is a
226 # Hydra-specific fix.
227 src = applyPatches {
228 src = fetchFromGitHub {
229 owner = "svanderburg";
230 repo = "node2nix";
231 rev = "node2nix-1.9.0";
232 sha256 = "0l4wp1131nhl9c14cn8bwawb8f77h1nfbnswgi5lp5m3kzkb27jn";
233 };
234
235 patches = [
236 # remove node_ name prefix
237 (fetchpatch {
238 url = "https://github.com/svanderburg/node2nix/commit/b54d45207427ff46e90f16f2f32771fdc8bff5a4.patch";
239 sha256 = "sha256-ubUdF0q3l4xxqZ7f9EiQEUQzyqxi9Q6zsRPETHlfzh8=";
240 })
241 # set meta platform
242 (fetchpatch {
243 url = "https://github.com/svanderburg/node2nix/commit/58736093161f2d237c17e75a96529b018cd0ac64.patch";
244 sha256 = "0sif7803c9g6gjmmdniw5qxrq5igiz9nqdmdrcf1hxfi5x43a32h";
245 })
246 # Extract common logic from composePackage to a shell function
247 (fetchpatch {
248 url = "https://github.com/svanderburg/node2nix/commit/e4c951971df6c9f9584c7252971c13b55c369916.patch";
249 sha256 = "0w8fcyr12g2340rn06isv40jkmz2khmak81c95zpkjgipzx7hp7w";
250 })
251 ];
252 };
253 postInstall = ''
254 wrapProgram "$out/bin/node2nix" --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.nix ]}
255 '';
256 };
257
258 node-red = super.node-red.override {
259 buildInputs = [ self.node-pre-gyp ];
260 };
261
262 mermaid-cli = super."@mermaid-js/mermaid-cli".override (
263 if stdenv.isDarwin
264 then {}
265 else {
266 nativeBuildInputs = [ pkgs.makeWrapper ];
267 prePatch = ''
268 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
269 '';
270 postInstall = ''
271 wrapProgram $out/bin/mmdc \
272 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
273 '';
274 });
275
276 pnpm = super.pnpm.override {
277 nativeBuildInputs = [ pkgs.makeWrapper ];
278
279 preRebuild = ''
280 sed 's/"link:/"file:/g' --in-place package.json
281 '';
282
283 postInstall = let
284 pnpmLibPath = pkgs.lib.makeBinPath [
285 nodejs.passthru.python
286 nodejs
287 ];
288 in ''
289 for prog in $out/bin/*; do
290 wrapProgram "$prog" --prefix PATH : ${pnpmLibPath}
291 done
292 '';
293 };
294
295 postcss-cli = super.postcss-cli.override {
296 nativeBuildInputs = [ pkgs.makeWrapper ];
297 postInstall = ''
298 wrapProgram "$out/bin/postcss" \
299 --prefix NODE_PATH : ${self.postcss}/lib/node_modules \
300 --prefix NODE_PATH : ${self.autoprefixer}/lib/node_modules
301 '';
302 passthru.tests = {
303 simple-execution = pkgs.callPackage ./package-tests/postcss-cli.nix {
304 inherit (self) postcss-cli;
305 };
306 };
307 meta.mainProgram = "postcss";
308 };
309
310 prisma = super.prisma.override rec {
311 nativeBuildInputs = [ pkgs.makeWrapper ];
312 version = "3.5.0";
313 src = fetchurl {
314 url = "https://registry.npmjs.org/prisma/-/prisma-${version}.tgz";
315 sha512 = "sha512-WEYQ+H98O0yigG+lI0gfh4iyBChvnM6QTXPDtY9eFraLXAmyb6tf/T2mUdrUAU1AEvHLVzQA5A+RpONZlQozBg==";
316 };
317 dependencies = [ rec {
318 name = "_at_prisma_slash_engines";
319 packageName = "@prisma/engines";
320 version = "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e";
321 src = fetchurl {
322 url = "https://registry.npmjs.org/@prisma/engines/-/engines-${version}.tgz";
323 sha512 = "sha512-MqZUrxuLlIbjB3wu8LrRJOKcvR4k3dunKoI4Q2bPfAwLQY0XlpsLZ3TRVW1c32ooVk939p6iGNkaCUo63Et36g==";
324 };
325 }];
326 postInstall = with pkgs; ''
327 wrapProgram "$out/bin/prisma" \
328 --set PRISMA_MIGRATION_ENGINE_BINARY ${prisma-engines}/bin/migration-engine \
329 --set PRISMA_QUERY_ENGINE_BINARY ${prisma-engines}/bin/query-engine \
330 --set PRISMA_QUERY_ENGINE_LIBRARY ${lib.getLib prisma-engines}/lib/libquery_engine.node \
331 --set PRISMA_INTROSPECTION_ENGINE_BINARY ${prisma-engines}/bin/introspection-engine \
332 --set PRISMA_FMT_BINARY ${prisma-engines}/bin/prisma-fmt
333 '';
334 };
335
336 pulp = super.pulp.override {
337 # tries to install purescript
338 npmFlags = "--ignore-scripts";
339
340 nativeBuildInputs = [ pkgs.makeWrapper ];
341 postInstall = ''
342 wrapProgram "$out/bin/pulp" --suffix PATH : ${pkgs.lib.makeBinPath [
343 pkgs.purescript
344 ]}
345 '';
346 };
347
348 reveal-md = super.reveal-md.override (
349 lib.optionalAttrs (!stdenv.isDarwin) {
350 nativeBuildInputs = [ pkgs.makeWrapper ];
351 prePatch = ''
352 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
353 '';
354 postInstall = ''
355 wrapProgram $out/bin/reveal-md \
356 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
357 '';
358 }
359 );
360
361 ssb-server = super.ssb-server.override {
362 buildInputs = [ pkgs.automake pkgs.autoconf self.node-gyp-build ];
363 meta.broken = since "10";
364 };
365
366 stf = super.stf.override {
367 meta.broken = since "10";
368 };
369
370 tedicross = super."tedicross-git+https://github.com/TediCross/TediCross.git#v0.8.7".override {
371 nativeBuildInputs = [ pkgs.makeWrapper ];
372 postInstall = ''
373 makeWrapper '${nodejs}/bin/node' "$out/bin/tedicross" \
374 --add-flags "$out/lib/node_modules/tedicross/main.js"
375 '';
376 };
377
378 tsun = super.tsun.overrideAttrs (oldAttrs: {
379 buildInputs = oldAttrs.buildInputs ++ [ pkgs.makeWrapper ];
380 postInstall = ''
381 wrapProgram "$out/bin/tsun" \
382 --prefix NODE_PATH : ${self.typescript}/lib/node_modules
383 '';
384 });
385
386 typescript-language-server = super.typescript-language-server.override {
387 nativeBuildInputs = [ pkgs.makeWrapper ];
388 postInstall = ''
389 wrapProgram "$out/bin/typescript-language-server" \
390 --prefix PATH : ${pkgs.lib.makeBinPath [ self.typescript ]}
391 '';
392 };
393
394 teck-programmer = super.teck-programmer.override {
395 buildInputs = [ pkgs.libusb1 ];
396 };
397
398 vega-cli = super.vega-cli.override {
399 nativeBuildInputs = [ pkgs.pkg-config ];
400 buildInputs = with pkgs; [
401 super.node-pre-gyp
402 pixman
403 cairo
404 pango
405 libjpeg
406 ];
407 };
408
409 vega-lite = super.vega-lite.override {
410 postInstall = ''
411 cd node_modules
412 for dep in ${self.vega-cli}/lib/node_modules/vega-cli/node_modules/*; do
413 if [[ ! -d $dep ]]; then
414 ln -s "${self.vega-cli}/lib/node_modules/vega-cli/node_modules/$dep"
415 fi
416 done
417 '';
418 passthru.tests = {
419 simple-execution = pkgs.callPackage ./package-tests/vega-lite.nix {
420 inherit (self) vega-lite;
421 };
422 };
423 };
424
425 webtorrent-cli = super.webtorrent-cli.override {
426 buildInputs = [ self.node-gyp-build ];
427 };
428
429 joplin = super.joplin.override {
430 nativeBuildInputs = [ pkgs.pkg-config ];
431 buildInputs = with pkgs; [
432 # required by sharp
433 # https://sharp.pixelplumbing.com/install
434 vips
435
436 libsecret
437 self.node-gyp-build
438 self.node-pre-gyp
439 ] ++ lib.optionals stdenv.isDarwin [
440 darwin.apple_sdk.frameworks.AppKit
441 darwin.apple_sdk.frameworks.Security
442 ];
443 };
444
445 thelounge = super.thelounge.override {
446 buildInputs = [ self.node-pre-gyp ];
447 postInstall = ''
448 echo /var/lib/thelounge > $out/lib/node_modules/thelounge/.thelounge_home
449 '';
450 };
451
452 yaml-language-server = super.yaml-language-server.override {
453 nativeBuildInputs = [ pkgs.makeWrapper ];
454 postInstall = ''
455 wrapProgram "$out/bin/yaml-language-server" \
456 --prefix NODE_PATH : ${self.prettier}/lib/node_modules
457 '';
458 };
459
460 wavedrom-cli = super.wavedrom-cli.override {
461 nativeBuildInputs = [ pkgs.pkg-config self.node-pre-gyp ];
462 # These dependencies are required by
463 # https://github.com/Automattic/node-canvas.
464 buildInputs = with pkgs; [
465 pixman
466 cairo
467 pango
468 ];
469 };
470 };
471in self