1# Do not use overrides in this file to add `meta.mainProgram` to packges. Use `./main-programs.nix`
2# instead.
3{ pkgs, nodejs }:
4
5let
6 inherit (pkgs)
7 stdenv
8 lib
9 callPackage
10 fetchFromGitHub
11 fetchurl
12 nixosTests;
13
14 since = version: lib.versionAtLeast nodejs.version version;
15 before = version: lib.versionOlder nodejs.version version;
16in
17
18final: prev: {
19 "@angular/cli" = prev."@angular/cli".override {
20 prePatch = ''
21 export NG_CLI_ANALYTICS=false
22 '';
23 };
24
25 "@electron-forge/cli" = prev."@electron-forge/cli".override {
26 buildInputs = [ final.node-gyp-build ];
27 };
28
29 "@forge/cli" = prev."@forge/cli".override {
30 nativeBuildInputs = [ pkgs.pkg-config ];
31 buildInputs = with pkgs; [
32 libsecret
33 final.node-gyp-build
34 final.node-pre-gyp
35 ] ++ lib.optionals stdenv.isDarwin [
36 darwin.apple_sdk.frameworks.AppKit
37 darwin.apple_sdk.frameworks.Security
38 ];
39 };
40
41 "@hyperspace/cli" = prev."@hyperspace/cli".override {
42 nativeBuildInputs = [ pkgs.makeWrapper ];
43 buildInputs = [ final.node-gyp-build ];
44 postInstall = ''wrapProgram "$out/bin/hyp" --prefix PATH : ${ lib.makeBinPath [ nodejs ] }'';
45 };
46 hyperspace-cli = final."@hyperspace/cli";
47
48 "@medable/mdctl-cli" = prev."@medable/mdctl-cli".override {
49 nativeBuildInputs = with pkgs; with darwin.apple_sdk.frameworks; [
50 glib
51 libsecret
52 pkg-config
53 ] ++ lib.optionals stdenv.isDarwin [
54 AppKit
55 Security
56 ];
57 buildInputs = [
58 final.node-gyp-build
59 final.node-pre-gyp
60 nodejs
61 ];
62 };
63 mdctl-cli = final."@medable/mdctl-cli";
64
65 autoprefixer = prev.autoprefixer.override {
66 nativeBuildInputs = [ pkgs.makeWrapper ];
67 postInstall = ''
68 wrapProgram "$out/bin/autoprefixer" \
69 --prefix NODE_PATH : ${final.postcss}/lib/node_modules
70 '';
71 passthru.tests = {
72 simple-execution = callPackage ./package-tests/autoprefixer.nix { inherit (final) autoprefixer; };
73 };
74 };
75
76 aws-azure-login = prev.aws-azure-login.override (oldAttrs: {
77 nativeBuildInputs = [ pkgs.makeWrapper ];
78 prePatch = ''
79 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
80 '';
81 postInstall = ''
82 wrapProgram $out/bin/aws-azure-login \
83 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium}/bin/chromium
84 '';
85 meta = oldAttrs.meta // { platforms = lib.platforms.linux; };
86 });
87
88 balanceofsatoshis = prev.balanceofsatoshis.override {
89 nativeBuildInputs = [ pkgs.installShellFiles ];
90 postInstall = ''
91 installShellCompletion --cmd bos\
92 --bash <($out/bin/bos completion bash)\
93 --zsh <($out/bin/bos completion zsh)\
94 --fish <($out/bin/bos completion fish)
95 '';
96 };
97
98 bitwarden-cli = prev."@bitwarden/cli".override {
99 name = "bitwarden-cli";
100 };
101
102 bower2nix = prev.bower2nix.override {
103 nativeBuildInputs = [ pkgs.makeWrapper ];
104 postInstall = ''
105 for prog in bower2nix fetch-bower; do
106 wrapProgram "$out/bin/$prog" --prefix PATH : ${lib.makeBinPath [ pkgs.git pkgs.nix ]}
107 done
108 '';
109 };
110
111 carbon-now-cli = prev.carbon-now-cli.override {
112 nativeBuildInputs = [ pkgs.makeWrapper ];
113 prePatch = ''
114 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
115 '';
116 postInstall = ''
117 wrapProgram $out/bin/carbon-now \
118 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
119 '';
120 };
121
122 coc-imselect = prev.coc-imselect.override (oldAttrs: {
123 meta = oldAttrs.meta // { broken = since "10"; };
124 });
125
126 dat = prev.dat.override (oldAttrs: {
127 buildInputs = [ final.node-gyp-build pkgs.libtool pkgs.autoconf pkgs.automake ];
128 meta = oldAttrs.meta // { broken = since "12"; };
129 });
130
131 deltachat-desktop = prev."deltachat-desktop-../../applications/networking/instant-messengers/deltachat-desktop".override (oldAttrs: {
132 meta = oldAttrs.meta // { broken = true; }; # use the top-level package instead
133 });
134
135 # NOTE: this is a stub package to fetch npm dependencies for
136 # ../../applications/video/epgstation
137 epgstation = prev."epgstation-../../applications/video/epgstation".override (oldAttrs: {
138 buildInputs = [ final.node-pre-gyp final.node-gyp-build ];
139 meta = oldAttrs.meta // { platforms = lib.platforms.none; };
140 });
141
142 # NOTE: this is a stub package to fetch npm dependencies for
143 # ../../applications/video/epgstation/client
144 epgstation-client = prev."epgstation-client-../../applications/video/epgstation/client".override (oldAttrs: {
145 meta = oldAttrs.meta // { platforms = lib.platforms.none; };
146 });
147
148 expo-cli = prev."expo-cli".override (oldAttrs: {
149 # The traveling-fastlane-darwin optional dependency aborts build on Linux.
150 dependencies = builtins.filter (d: d.packageName != "@expo/traveling-fastlane-${if stdenv.isLinux then "darwin" else "linux"}") oldAttrs.dependencies;
151 });
152
153 fast-cli = prev.fast-cli.override {
154 nativeBuildInputs = [ pkgs.makeWrapper ];
155 prePatch = ''
156 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
157 '';
158 postInstall = ''
159 wrapProgram $out/bin/fast \
160 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
161 '';
162 };
163
164 flood = prev.flood.override {
165 buildInputs = [ final.node-pre-gyp ];
166 };
167
168 git-ssb = prev.git-ssb.override (oldAttrs: {
169 buildInputs = [ final.node-gyp-build ];
170 meta = oldAttrs.meta // { broken = since "10"; };
171 });
172
173 graphql-language-service-cli = prev.graphql-language-service-cli.override {
174 nativeBuildInputs = [ pkgs.makeWrapper ];
175 postInstall = ''
176 wrapProgram "$out/bin/graphql-lsp" \
177 --prefix NODE_PATH : ${final.graphql}/lib/node_modules
178 '';
179 };
180
181 hsd = prev.hsd.override {
182 buildInputs = [ final.node-gyp-build pkgs.unbound ];
183 };
184
185 ijavascript = prev.ijavascript.override (oldAttrs: {
186 preRebuild = ''
187 export NPM_CONFIG_ZMQ_EXTERNAL=true
188 '';
189 buildInputs = oldAttrs.buildInputs ++ [ final.node-gyp-build pkgs.zeromq ];
190 });
191
192 insect = prev.insect.override (oldAttrs: {
193 nativeBuildInputs = oldAttrs.nativeBuildInputs or [] ++ [ pkgs.psc-package final.pulp ];
194 });
195
196 intelephense = prev.intelephense.override (oldAttrs: {
197 meta = oldAttrs.meta // { license = lib.licenses.unfree; };
198 });
199
200 joplin = prev.joplin.override {
201 nativeBuildInputs = [ pkgs.pkg-config ];
202 buildInputs = with pkgs; [
203 # required by sharp
204 # https://sharp.pixelplumbing.com/install
205 vips
206
207 libsecret
208 final.node-gyp-build
209 final.node-pre-gyp
210 ] ++ lib.optionals stdenv.isDarwin [
211 darwin.apple_sdk.frameworks.AppKit
212 darwin.apple_sdk.frameworks.Security
213 ];
214 };
215
216 jsonplaceholder = prev.jsonplaceholder.override {
217 buildInputs = [ nodejs ];
218 postInstall = ''
219 exe=$out/bin/jsonplaceholder
220 mkdir -p $out/bin
221 cat >$exe <<EOF
222 #!${pkgs.runtimeShell}
223 exec -a jsonplaceholder ${nodejs}/bin/node $out/lib/node_modules/jsonplaceholder/index.js
224 EOF
225 chmod a+x $exe
226 '';
227 };
228
229 makam = prev.makam.override {
230 nativeBuildInputs = [ pkgs.makeWrapper ];
231 postFixup = ''
232 wrapProgram "$out/bin/makam" --prefix PATH : ${lib.makeBinPath [ nodejs ]}
233 ${
234 if stdenv.isLinux
235 then "patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux-x86-64.so.2 \"$out/lib/node_modules/makam/makam-bin-linux64\""
236 else ""
237 }
238 '';
239 };
240
241 manta = prev.manta.override {
242 nativeBuildInputs = with pkgs; [ nodejs-14_x installShellFiles ];
243 postInstall = ''
244 # create completions, following upstream procedure https://github.com/joyent/node-manta/blob/v5.2.3/Makefile#L85-L91
245 completion_cmds=$(find ./bin -type f -printf "%f\n")
246
247 node ./lib/create_client.js
248 for cmd in $completion_cmds; do
249 installShellCompletion --cmd $cmd --bash <(./bin/$cmd --completion)
250 done
251 '';
252 };
253
254 mermaid-cli = prev."@mermaid-js/mermaid-cli".override (
255 if stdenv.isDarwin
256 then {}
257 else {
258 nativeBuildInputs = [ pkgs.makeWrapper ];
259 prePatch = ''
260 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
261 '';
262 postInstall = ''
263 wrapProgram $out/bin/mmdc \
264 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
265 '';
266 });
267
268 near-cli = prev.near-cli.override {
269 nativeBuildInputs = with pkgs; [
270 libusb1
271 final.prebuild-install
272 final.node-gyp-build
273 pkg-config
274 ];
275 };
276
277 node-gyp = prev.node-gyp.override {
278 nativeBuildInputs = [ pkgs.makeWrapper ];
279 # Teach node-gyp to use nodejs headers locally rather that download them form https://nodejs.org.
280 # This is important when build nodejs packages in sandbox.
281 postInstall = ''
282 wrapProgram "$out/bin/node-gyp" \
283 --set npm_config_nodedir ${nodejs}
284 '';
285 };
286
287 node-inspector = prev.node-inspector.override (oldAttrs: {
288 buildInputs = [ final.node-pre-gyp ];
289 meta = oldAttrs.meta // { broken = since "10"; };
290 });
291
292 node-red = prev.node-red.override {
293 buildInputs = [ final.node-pre-gyp ];
294 };
295
296 node2nix = prev.node2nix.override {
297 nativeBuildInputs = [ pkgs.makeWrapper ];
298 # We need to use master because of a fix that replaces git:// url to https://.
299 src = fetchFromGitHub {
300 owner = "svanderburg";
301 repo = "node2nix";
302 rev = "68f5735f9a56737e3fedceb182705985e3ab8799";
303 sha256 = "sha256-NK6gDTkGx0GG7yPTwgtFC4ttQZPfcLaLp8W8OOMO6bg=";
304 };
305
306 postInstall = ''
307 wrapProgram "$out/bin/node2nix" --prefix PATH : ${lib.makeBinPath [ pkgs.nix ]}
308 '';
309 };
310
311 parcel = prev.parcel.override {
312 buildInputs = [ final.node-gyp-build ];
313 preRebuild = ''
314 sed -i -e "s|#!/usr/bin/env node|#! ${nodejs}/bin/node|" node_modules/node-gyp-build/bin.js
315 '';
316 };
317
318 pnpm = prev.pnpm.override {
319 nativeBuildInputs = [ pkgs.makeWrapper ];
320
321 preRebuild = ''
322 sed 's/"link:/"file:/g' --in-place package.json
323 '';
324
325 postInstall = let
326 pnpmLibPath = lib.makeBinPath [
327 nodejs.passthru.python
328 nodejs
329 ];
330 in ''
331 for prog in $out/bin/*; do
332 wrapProgram "$prog" --prefix PATH : ${pnpmLibPath}
333 done
334 '';
335 };
336
337 postcss-cli = prev.postcss-cli.override (oldAttrs: {
338 nativeBuildInputs = [ pkgs.makeWrapper ];
339 postInstall = ''
340 wrapProgram "$out/bin/postcss" \
341 --prefix NODE_PATH : ${final.postcss}/lib/node_modules \
342 --prefix NODE_PATH : ${final.autoprefixer}/lib/node_modules
343 ln -s '${final.postcss}/lib/node_modules/postcss' "$out/lib/node_modules/postcss"
344 '';
345 passthru.tests = {
346 simple-execution = callPackage ./package-tests/postcss-cli.nix {
347 inherit (final) postcss-cli;
348 };
349 };
350 meta = oldAttrs.meta // { maintainers = with lib.maintainers; [ Luflosi ]; };
351 });
352
353 # To update prisma, please first update prisma-engines to the latest
354 # version. Then change the correct hash to this package. The PR should hold
355 # two commits: one for the engines and the other one for the node package.
356 prisma = prev.prisma.override rec {
357 nativeBuildInputs = [ pkgs.makeWrapper ];
358
359 inherit (pkgs.prisma-engines) version;
360
361 src = fetchurl {
362 url = "https://registry.npmjs.org/prisma/-/prisma-${version}.tgz";
363 sha512 = "sha512-yw50J8If2dKP4wYIi695zthsCASQFHiogGvUHHWd3falx/rpsD6Sb1LMLRV9nO3iGG3lozxNJ2PSINxK7xwdpg==";
364 };
365 postInstall = with pkgs; ''
366 wrapProgram "$out/bin/prisma" \
367 --set PRISMA_MIGRATION_ENGINE_BINARY ${prisma-engines}/bin/migration-engine \
368 --set PRISMA_QUERY_ENGINE_BINARY ${prisma-engines}/bin/query-engine \
369 --set PRISMA_QUERY_ENGINE_LIBRARY ${lib.getLib prisma-engines}/lib/libquery_engine.node \
370 --set PRISMA_INTROSPECTION_ENGINE_BINARY ${prisma-engines}/bin/introspection-engine \
371 --set PRISMA_FMT_BINARY ${prisma-engines}/bin/prisma-fmt
372 '';
373
374 passthru.tests = {
375 simple-execution = pkgs.callPackage ./package-tests/prisma.nix {
376 inherit (final) prisma;
377 };
378 };
379 };
380
381 pulp = prev.pulp.override {
382 # tries to install purescript
383 npmFlags = "--ignore-scripts";
384
385 nativeBuildInputs = [ pkgs.makeWrapper ];
386 postInstall = ''
387 wrapProgram "$out/bin/pulp" --suffix PATH : ${lib.makeBinPath [
388 pkgs.purescript
389 ]}
390 '';
391 };
392
393 reveal-md = prev.reveal-md.override (
394 lib.optionalAttrs (!stdenv.isDarwin) {
395 nativeBuildInputs = [ pkgs.makeWrapper ];
396 prePatch = ''
397 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
398 '';
399 postInstall = ''
400 wrapProgram $out/bin/reveal-md \
401 --set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
402 '';
403 }
404 );
405
406 ssb-server = prev.ssb-server.override (oldAttrs: {
407 buildInputs = [ pkgs.automake pkgs.autoconf final.node-gyp-build ];
408 meta = oldAttrs.meta // { broken = since "10"; };
409 });
410
411 stf = prev.stf.override (oldAttrs: {
412 meta = oldAttrs.meta // { broken = since "10"; };
413 });
414
415 tailwindcss = prev.tailwindcss.override {
416 plugins = [ ];
417 nativeBuildInputs = [ pkgs.makeWrapper ];
418 postInstall = ''
419 nodePath=""
420 for p in "$out" "${final.postcss}" $plugins; do
421 nodePath="$nodePath''${nodePath:+:}$p/lib/node_modules"
422 done
423 wrapProgram "$out/bin/tailwind" \
424 --prefix NODE_PATH : "$nodePath"
425 wrapProgram "$out/bin/tailwindcss" \
426 --prefix NODE_PATH : "$nodePath"
427 unset nodePath
428 '';
429 passthru.tests = {
430 simple-execution = callPackage ./package-tests/tailwindcss.nix {
431 inherit (final) tailwindcss;
432 };
433 };
434 };
435
436 teck-programmer = prev.teck-programmer.override {
437 nativeBuildInputs = [ final.node-gyp-build ];
438 buildInputs = [ pkgs.libusb1 ];
439 };
440
441 tedicross = prev."tedicross-git+https://github.com/TediCross/TediCross.git#v0.8.7".override {
442 nativeBuildInputs = [ pkgs.makeWrapper ];
443 postInstall = ''
444 makeWrapper '${nodejs}/bin/node' "$out/bin/tedicross" \
445 --add-flags "$out/lib/node_modules/tedicross/main.js"
446 '';
447 };
448
449 thelounge = prev.thelounge.override (oldAttrs: {
450 buildInputs = [ final.node-pre-gyp ];
451 postInstall = ''
452 echo /var/lib/thelounge > $out/lib/node_modules/thelounge/.thelounge_home
453 patch -d $out/lib/node_modules/thelounge -p1 < ${./thelounge-packages-path.patch}
454 '';
455 passthru.tests = { inherit (nixosTests) thelounge; };
456 meta = oldAttrs.meta // { maintainers = with lib.maintainers; [ winter ]; };
457 });
458
459 thelounge-plugin-closepms = prev.thelounge-plugin-closepms.override {
460 nativeBuildInputs = [ final.node-pre-gyp ];
461 };
462
463 thelounge-plugin-giphy = prev.thelounge-plugin-giphy.override {
464 nativeBuildInputs = [ final.node-pre-gyp ];
465 };
466
467 thelounge-theme-flat-blue = prev.thelounge-theme-flat-blue.override {
468 nativeBuildInputs = [ final.node-pre-gyp ];
469 };
470
471 thelounge-theme-flat-dark = prev.thelounge-theme-flat-dark.override {
472 nativeBuildInputs = [ final.node-pre-gyp ];
473 };
474
475 triton = prev.triton.override {
476 nativeBuildInputs = [ pkgs.installShellFiles ];
477 postInstall = ''
478 installShellCompletion --cmd triton --bash <($out/bin/triton completion)
479 '';
480 };
481
482 ts-node = prev.ts-node.override {
483 nativeBuildInputs = [ pkgs.makeWrapper ];
484 postInstall = ''
485 wrapProgram "$out/bin/ts-node" \
486 --prefix NODE_PATH : ${final.typescript}/lib/node_modules
487 '';
488 };
489
490 tsun = prev.tsun.override {
491 nativeBuildInputs = [ pkgs.makeWrapper ];
492 postInstall = ''
493 wrapProgram "$out/bin/tsun" \
494 --prefix NODE_PATH : ${final.typescript}/lib/node_modules
495 '';
496 };
497
498 typescript-language-server = prev.typescript-language-server.override {
499 nativeBuildInputs = [ pkgs.makeWrapper ];
500 postInstall = ''
501 wrapProgram "$out/bin/typescript-language-server" \
502 --suffix PATH : ${lib.makeBinPath [ final.typescript ]}
503 '';
504 };
505
506 uppy-companion = prev."@uppy/companion".override {
507 name = "uppy-companion";
508 };
509
510 vega-cli = prev.vega-cli.override {
511 nativeBuildInputs = [ pkgs.pkg-config ];
512 buildInputs = with pkgs; [
513 final.node-pre-gyp
514 pixman
515 cairo
516 pango
517 libjpeg
518 ] ++ lib.optionals stdenv.isDarwin [
519 darwin.apple_sdk.frameworks.CoreText
520 ];
521 };
522
523 vega-lite = prev.vega-lite.override {
524 postInstall = ''
525 cd node_modules
526 for dep in ${final.vega-cli}/lib/node_modules/vega-cli/node_modules/*; do
527 if [[ ! -d $dep ]]; then
528 ln -s "${final.vega-cli}/lib/node_modules/vega-cli/node_modules/$dep"
529 fi
530 done
531 '';
532 passthru.tests = {
533 simple-execution = callPackage ./package-tests/vega-lite.nix {
534 inherit (final) vega-lite;
535 };
536 };
537 };
538
539 wavedrom-cli = prev.wavedrom-cli.override {
540 nativeBuildInputs = [ pkgs.pkg-config final.node-pre-gyp ];
541 # These dependencies are required by
542 # https://github.com/Automattic/node-canvas.
543 buildInputs = with pkgs; [
544 pixman
545 cairo
546 pango
547 ] ++ lib.optionals stdenv.isDarwin [
548 darwin.apple_sdk.frameworks.CoreText
549 ];
550 };
551
552 webtorrent-cli = prev.webtorrent-cli.override {
553 buildInputs = [ final.node-gyp-build ];
554 };
555
556 yaml-language-server = prev.yaml-language-server.override {
557 nativeBuildInputs = [ pkgs.makeWrapper ];
558 postInstall = ''
559 wrapProgram "$out/bin/yaml-language-server" \
560 --prefix NODE_PATH : ${final.prettier}/lib/node_modules
561 '';
562 };
563}