nodePackages: make it easy to add meta.mainProgram to packages

This was accomplish by moving the current overrides overlay out of
./default.nix into to a seperate file ./overrides.nix, and composing
that overlay an overlay ,`mainProgramOverrides`, (defined in
./default.nix) which uses the contents of a new file ./main-programs.nix
to create overrides that add `meta.mainProgram` to packages.

The following changes were also made to existing overrides:
* `self` and `super` where changed to `final` and `prev` respectively
* Existing additions of `mainProgram` were moved to ./main-programs.nix
* References to `pkgs.lib` were changed to `lib`
* References to `pkgs.nodejs` were changed to `nodejs`
* References to `nodePackages` were changed  to `final`
* References to `pkgs.callPackage` were changed to `callPackage`

Finally `meta.mainProgram` was added to all packages that provide a
single executable whose name differs from the package's name, for
packages available on `{aarch64,x86_64}-darwin` and `x86_64-linux`.
This commit is contained in:
Malo Bourgon 2022-05-06 13:50:19 -07:00
parent 745739f280
commit 31673e9aee
3 changed files with 623 additions and 534 deletions

View File

@ -1,540 +1,23 @@
{ pkgs, nodejs, stdenv, applyPatches, fetchFromGitHub, fetchpatch, fetchurl, nixosTests }:
{ pkgs, lib, nodejs, stdenv}:
let
inherit (pkgs) lib;
since = version: pkgs.lib.versionAtLeast nodejs.version version;
before = version: pkgs.lib.versionOlder nodejs.version version;
super = import ./composition.nix {
inherit (lib) composeManyExtensions extends makeExtensible mapAttrs;
nodePackages = final: import ./composition.nix {
inherit pkgs nodejs;
inherit (stdenv.hostPlatform) system;
};
self = super // {
"@angular/cli" = super."@angular/cli".override {
prePatch = ''
export NG_CLI_ANALYTICS=false
'';
};
"@electron-forge/cli" = super."@electron-forge/cli".override {
buildInputs = [ self.node-pre-gyp self.rimraf ];
};
autoprefixer = super.autoprefixer.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/autoprefixer" \
--prefix NODE_PATH : ${self.postcss}/lib/node_modules
'';
passthru.tests = {
simple-execution = pkgs.callPackage ./package-tests/autoprefixer.nix { inherit (self) autoprefixer; };
};
};
aws-azure-login = super.aws-azure-login.override (oldAttrs: {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/aws-azure-login \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium}/bin/chromium
'';
meta = oldAttrs.meta // { platforms = pkgs.lib.platforms.linux; };
});
bitwarden-cli = super."@bitwarden/cli".override (oldAttrs: {
name = "bitwarden-cli";
meta = oldAttrs.meta // { mainProgram = "bw"; };
});
bower2nix = super.bower2nix.override {
buildInputs = [ pkgs.makeWrapper ];
postInstall = ''
for prog in bower2nix fetch-bower; do
wrapProgram "$out/bin/$prog" --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.git pkgs.nix ]}
done
'';
};
carbon-now-cli = super.carbon-now-cli.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/carbon-now \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
'';
};
coc-imselect = super.coc-imselect.override (oldAttrs: {
meta = oldAttrs.meta // { broken = since "10"; };
});
dat = super.dat.override (oldAttrs: {
buildInputs = [ self.node-gyp-build pkgs.libtool pkgs.autoconf pkgs.automake ];
meta = oldAttrs.meta // { broken = since "12"; };
});
deltachat-desktop = super."deltachat-desktop-../../applications/networking/instant-messengers/deltachat-desktop".override (oldAttrs: {
meta = oldAttrs.meta // { broken = true; }; # use the top-level package instead
});
# NOTE: this is a stub package to fetch npm dependencies for
# ../../applications/video/epgstation
epgstation = super."epgstation-../../applications/video/epgstation".override (oldAttrs: {
buildInputs = [ self.node-pre-gyp self.node-gyp-build ];
meta = oldAttrs.meta // { platforms = pkgs.lib.platforms.none; };
});
# NOTE: this is a stub package to fetch npm dependencies for
# ../../applications/video/epgstation/client
epgstation-client = super."epgstation-client-../../applications/video/epgstation/client".override (oldAttrs: {
meta = oldAttrs.meta // { platforms = pkgs.lib.platforms.none; };
});
expo-cli = super."expo-cli".override (oldAttrs: {
# The traveling-fastlane-darwin optional dependency aborts build on Linux.
dependencies = builtins.filter (d: d.packageName != "@expo/traveling-fastlane-${if stdenv.isLinux then "darwin" else "linux"}") oldAttrs.dependencies;
});
fast-cli = super.fast-cli.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/fast \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
'';
};
flood = super.flood.override (oldAttrs: {
buildInputs = [ self.node-pre-gyp ];
meta = oldAttrs.meta // { mainProgram = "flood"; };
});
git-ssb = super.git-ssb.override (oldAttrs: {
buildInputs = [ self.node-gyp-build ];
meta = oldAttrs.meta // { broken = since "10"; };
});
hsd = super.hsd.override {
buildInputs = [ self.node-gyp-build pkgs.unbound ];
};
hyperspace-cli = super."@hyperspace/cli".override {
nativeBuildInputs = with pkgs; [
makeWrapper
libtool
autoconf
automake
];
buildInputs = with pkgs; [
nodePackages.node-gyp-build
nodejs
];
postInstall = ''
wrapProgram "$out/bin/hyp" --prefix PATH : ${
pkgs.lib.makeBinPath [ pkgs.nodejs ]
}
'';
};
ijavascript = super.ijavascript.override (oldAttrs: {
preRebuild = ''
export NPM_CONFIG_ZMQ_EXTERNAL=true
'';
buildInputs = oldAttrs.buildInputs ++ [ self.node-gyp-build pkgs.zeromq ];
});
insect = super.insect.override (oldAttrs: {
nativeBuildInputs = oldAttrs.nativeBuildInputs or [] ++ [ pkgs.psc-package self.pulp ];
});
intelephense = super.intelephense.override (oldAttrs: {
meta = oldAttrs.meta // { license = pkgs.lib.licenses.unfree; };
});
joplin = super.joplin.override {
nativeBuildInputs = [ pkgs.pkg-config ];
buildInputs = with pkgs; [
# required by sharp
# https://sharp.pixelplumbing.com/install
vips
libsecret
self.node-gyp-build
self.node-pre-gyp
] ++ lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.AppKit
darwin.apple_sdk.frameworks.Security
];
};
jsonplaceholder = super.jsonplaceholder.override {
buildInputs = [ nodejs ];
postInstall = ''
exe=$out/bin/jsonplaceholder
mkdir -p $out/bin
cat >$exe <<EOF
#!${pkgs.runtimeShell}
exec -a jsonplaceholder ${nodejs}/bin/node $out/lib/node_modules/jsonplaceholder/index.js
EOF
chmod a+x $exe
'';
};
makam = super.makam.override {
buildInputs = [ pkgs.nodejs pkgs.makeWrapper ];
postFixup = ''
wrapProgram "$out/bin/makam" --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.nodejs ]}
${
if stdenv.isLinux
then "patchelf --set-interpreter ${stdenv.glibc}/lib/ld-linux-x86-64.so.2 \"$out/lib/node_modules/makam/makam-bin-linux64\""
else ""
}
'';
};
manta = super.manta.override {
nativeBuildInputs = with pkgs; [ nodejs-14_x installShellFiles ];
postInstall = ''
# create completions, following upstream procedure https://github.com/joyent/node-manta/blob/v5.2.3/Makefile#L85-L91
completion_cmds=$(find ./bin -type f -printf "%f\n")
node ./lib/create_client.js
for cmd in $completion_cmds; do
installShellCompletion --cmd $cmd --bash <(./bin/$cmd --completion)
done
'';
};
markdownlint-cli = super.markdownlint-cli.override (oldAttrs: {
meta = oldAttrs.meta // { mainProgram = "markdownlint"; };
});
mdctl-cli = super."@medable/mdctl-cli".override {
nativeBuildInputs = with pkgs; with darwin.apple_sdk.frameworks; [
glib
libsecret
pkg-config
] ++ lib.optionals stdenv.isDarwin [
AppKit
Security
];
buildInputs = with pkgs; [
nodePackages.node-gyp-build
nodePackages.node-pre-gyp
nodejs
];
};
mermaid-cli = super."@mermaid-js/mermaid-cli".override (
if stdenv.isDarwin
then {}
else {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/mmdc \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
'';
});
near-cli = super.near-cli.override {
nativeBuildInputs = with pkgs; [
libusb1
nodePackages.prebuild-install
nodePackages.node-gyp-build
pkg-config
];
};
node-gyp = super.node-gyp.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
# Teach node-gyp to use nodejs headers locally rather that download them form https://nodejs.org.
# This is important when build nodejs packages in sandbox.
postInstall = ''
wrapProgram "$out/bin/node-gyp" \
--set npm_config_nodedir ${nodejs}
'';
};
node-inspector = super.node-inspector.override (oldAttrs: {
buildInputs = [ self.node-pre-gyp ];
meta = oldAttrs.meta // { broken = since "10"; };
});
node-red = super.node-red.override {
buildInputs = [ self.node-pre-gyp ];
};
node2nix = super.node2nix.override {
buildInputs = [ pkgs.makeWrapper ];
# We need to use master because of a fix that replaces git:// url to https://.
src = fetchFromGitHub {
owner = "svanderburg";
repo = "node2nix";
rev = "68f5735f9a56737e3fedceb182705985e3ab8799";
sha256 = "sha256-NK6gDTkGx0GG7yPTwgtFC4ttQZPfcLaLp8W8OOMO6bg=";
};
postInstall = ''
wrapProgram "$out/bin/node2nix" --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.nix ]}
'';
};
parcel = super.parcel.override {
buildInputs = [ self.node-gyp-build ];
preRebuild = ''
sed -i -e "s|#!/usr/bin/env node|#! ${pkgs.nodejs}/bin/node|" node_modules/node-gyp-build/bin.js
'';
};
pnpm = super.pnpm.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
preRebuild = ''
sed 's/"link:/"file:/g' --in-place package.json
'';
postInstall = let
pnpmLibPath = pkgs.lib.makeBinPath [
nodejs.passthru.python
nodejs
];
in ''
for prog in $out/bin/*; do
wrapProgram "$prog" --prefix PATH : ${pnpmLibPath}
done
'';
};
postcss-cli = super.postcss-cli.override (oldAttrs: {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/postcss" \
--prefix NODE_PATH : ${self.postcss}/lib/node_modules \
--prefix NODE_PATH : ${self.autoprefixer}/lib/node_modules
ln -s '${self.postcss}/lib/node_modules/postcss' "$out/lib/node_modules/postcss"
'';
passthru.tests = {
simple-execution = pkgs.callPackage ./package-tests/postcss-cli.nix {
inherit (self) postcss-cli;
};
};
meta = oldAttrs.meta // {
mainProgram = "postcss";
maintainers = with lib.maintainers; [ Luflosi ];
};
});
# To update prisma, please first update prisma-engines to the latest
# version. Then change the correct hash to this package. The PR should hold
# two commits: one for the engines and the other one for the node package.
prisma = super.prisma.override rec {
nativeBuildInputs = [ pkgs.makeWrapper ];
inherit (pkgs.prisma-engines) version;
src = fetchurl {
url = "https://registry.npmjs.org/prisma/-/prisma-${version}.tgz";
sha512 = "sha512-l9MOgNCn/paDE+i1K2fp9NZ+Du4trzPTJsGkaQHVBufTGqzoYHuNk8JfzXuIn0Gte6/ZjyKj652Jq/Lc1tp2yw==";
};
postInstall = with pkgs; ''
wrapProgram "$out/bin/prisma" \
--set PRISMA_MIGRATION_ENGINE_BINARY ${prisma-engines}/bin/migration-engine \
--set PRISMA_QUERY_ENGINE_BINARY ${prisma-engines}/bin/query-engine \
--set PRISMA_QUERY_ENGINE_LIBRARY ${lib.getLib prisma-engines}/lib/libquery_engine.node \
--set PRISMA_INTROSPECTION_ENGINE_BINARY ${prisma-engines}/bin/introspection-engine \
--set PRISMA_FMT_BINARY ${prisma-engines}/bin/prisma-fmt
'';
passthru.tests = {
simple-execution = pkgs.callPackage ./package-tests/prisma.nix {
inherit (self) prisma;
};
};
};
pulp = super.pulp.override {
# tries to install purescript
npmFlags = "--ignore-scripts";
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/pulp" --suffix PATH : ${pkgs.lib.makeBinPath [
pkgs.purescript
]}
'';
};
reveal-md = super.reveal-md.override (
lib.optionalAttrs (!stdenv.isDarwin) {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/reveal-md \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
'';
}
);
ssb-server = super.ssb-server.override (oldAttrs: {
buildInputs = [ pkgs.automake pkgs.autoconf self.node-gyp-build ];
meta = oldAttrs.meta // { broken = since "10"; };
});
stf = super.stf.override (oldAttrs: {
meta = oldAttrs.meta // { broken = since "10"; };
});
tailwindcss = super.tailwindcss.override {
plugins = [ ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
nodePath=""
for p in "$out" "${self.postcss}" $plugins; do
nodePath="$nodePath''${nodePath:+:}$p/lib/node_modules"
done
wrapProgram "$out/bin/tailwind" \
--prefix NODE_PATH : "$nodePath"
wrapProgram "$out/bin/tailwindcss" \
--prefix NODE_PATH : "$nodePath"
unset nodePath
'';
passthru.tests = {
simple-execution = pkgs.callPackage ./package-tests/tailwindcss.nix { inherit (self) tailwindcss; };
};
};
teck-programmer = super.teck-programmer.override {
nativeBuildInputs = [ self.node-gyp-build ];
buildInputs = [ pkgs.libusb1 ];
};
tedicross = super."tedicross-git+https://github.com/TediCross/TediCross.git#v0.8.7".override {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
makeWrapper '${nodejs}/bin/node' "$out/bin/tedicross" \
--add-flags "$out/lib/node_modules/tedicross/main.js"
'';
};
thelounge = super.thelounge.override (oldAttrs: {
buildInputs = [ self.node-pre-gyp ];
postInstall = ''
echo /var/lib/thelounge > $out/lib/node_modules/thelounge/.thelounge_home
patch -d $out/lib/node_modules/thelounge -p1 < ${./thelounge-packages-path.patch}
'';
passthru.tests = { inherit (nixosTests) thelounge; };
meta = oldAttrs.meta // { maintainers = with lib.maintainers; [ winter ]; };
});
thelounge-plugin-closepms = super.thelounge-plugin-closepms.override {
nativeBuildInputs = [ self.node-pre-gyp ];
};
thelounge-theme-flat-blue = super.thelounge-theme-flat-blue.override {
nativeBuildInputs = [ self.node-pre-gyp ];
};
thelounge-theme-flat-dark = super.thelounge-theme-flat-dark.override {
nativeBuildInputs = [ self.node-pre-gyp ];
};
triton = super.triton.override {
nativeBuildInputs = [ pkgs.installShellFiles ];
postInstall = ''
installShellCompletion --cmd triton --bash <($out/bin/triton completion)
'';
};
ts-node = super.ts-node.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/ts-node" \
--prefix NODE_PATH : ${self.typescript}/lib/node_modules
'';
});
tsun = super.tsun.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/tsun" \
--prefix NODE_PATH : ${self.typescript}/lib/node_modules
'';
});
typescript = super.typescript.override (oldAttrs: {
meta = oldAttrs.meta // { mainProgram = "tsc"; };
});
typescript-language-server = super.typescript-language-server.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/typescript-language-server" \
--suffix PATH : ${pkgs.lib.makeBinPath [ self.typescript ]}
'';
};
uppy-companion = super."@uppy/companion".override {
name = "uppy-companion";
};
vega-cli = super.vega-cli.override {
nativeBuildInputs = [ pkgs.pkg-config ];
buildInputs = with pkgs; [
super.node-pre-gyp
pixman
cairo
pango
libjpeg
];
};
vega-lite = super.vega-lite.override {
postInstall = ''
cd node_modules
for dep in ${self.vega-cli}/lib/node_modules/vega-cli/node_modules/*; do
if [[ ! -d $dep ]]; then
ln -s "${self.vega-cli}/lib/node_modules/vega-cli/node_modules/$dep"
fi
done
'';
passthru.tests = {
simple-execution = pkgs.callPackage ./package-tests/vega-lite.nix {
inherit (self) vega-lite;
};
};
};
wavedrom-cli = super.wavedrom-cli.override {
nativeBuildInputs = [ pkgs.pkg-config self.node-pre-gyp ];
# These dependencies are required by
# https://github.com/Automattic/node-canvas.
buildInputs = with pkgs; [
pixman
cairo
pango
];
};
webtorrent-cli = super.webtorrent-cli.override {
buildInputs = [ self.node-gyp-build ];
};
yaml-language-server = super.yaml-language-server.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/yaml-language-server" \
--prefix NODE_PATH : ${self.prettier}/lib/node_modules
'';
};
};
in self
mainProgramOverrides = final: prev:
mapAttrs (pkgName: mainProgram:
prev.${pkgName}.override (oldAttrs: {
meta = oldAttrs.meta // { inherit mainProgram; };
})
) (import ./main-programs.nix);
extensions = composeManyExtensions [
mainProgramOverrides
(import ./overrides.nix { inherit pkgs nodejs; })
];
in
makeExtensible (extends extensions nodePackages)

View File

@ -0,0 +1,74 @@
# Use this file to add `meta.mainProgram` to packages in `nodePackages`, that don't provide an
# executable that matches that packages name, so that they'll work with `nix run`.
{
# Packages that provide multiple executables where one is clearly the `mainProgram`.
typescript = "tsc";
# Packages that provide a single executable whose name differs from the package's `name`.
"@angular/cli" = "ng";
"@antora/cli" = "antora";
"@astrojs/language-server" = "astro-ls";
"@bitwarden/cli" = "bw";
"@commitlint/cli" = "commitlint";
"@gitbeaker/cli" = "gitbeaker";
"@google/clasp" = "clasp";
"@hyperspace/cli" = "hyp";
"@medable/mdctl-cli" = "mdctl";
"@mermaid-js/mermaid-cli" = "mmdc";
"@nerdwallet/shepherd" = "shepherd";
"@nestjs/cli" = "nest";
"@prisma/language-server" = "prisma-language-server";
"@tailwindcss/language-server" = "tailwindcss-language-server";
"@uppy/companion" = "companion";
"@vue/cli" = "vue";
"@webassemblyjs/repl" = "wasm";
"@webassemblyjs/wasm-strip" = "wasm-strip";
"@webassemblyjs/wasm-text-gen" = "wasmgen";
"@webassemblyjs/wast-refmt" = "wast-refmt";
balanceofsatoshis = "bos";
carbon-now-cli = "carbon-now";
cdk8s-cli = "cdk8s";
cdktf-cli = "cdktf";
clean-css-cli = "cleancss";
clipboard-cli = "clipboard";
clubhouse-cli = "club";
conventional-changelog-cli = "conventional-changelog";
cpy-cli = "cpy";
dockerfile-language-server-nodejs = "docker-langserver";
fast-cli = "fast";
fauna-shell = "fauna";
firebase-tools = "firebase";
fkill-cli = "fkill";
fleek-cli = "fleek";
git-run = "gr";
gitmoji-cli = "gitmoji";
graphql-cli = "graphql";
grunt-cli = "grunt";
gulp-cli = "gulp";
kaput-cli = "kaput";
leetcode-cli = "leetcode";
less = "lessc";
lua-fmt = "luafmt";
markdownlint-cli = "markdownlint";
near-cli = "near";
neovim = "neovim-node-host";
parcel-bundler = "parcel";
parsoid = "parse.js";
poor-mans-t-sql-formatter-cli = "sqlformat";
postcss-cli = "postcss";
purescript-psa = "psa";
react-native-cli = "react-native";
react-tools = "jsx";
remod-cli = "remod";
s3http = "s3http.js";
svelte-language-server = "svelteserver";
teck-programmer = "teck-firmware-upgrade";
uglify-js = "uglifyjs";
undollar = "$";
vsc-leetcode-cli = "leetcode";
vscode-css-languageserver-bin = "css-languageserver";
vscode-html-languageserver-bin = "html-languageserver";
vscode-json-languageserver-bin = "json-languageserver";
vue-language-server = "vls";
webtorrent-cli = "webtorrent";
}

View File

@ -0,0 +1,532 @@
# Do not use overrides in this file to add `meta.mainProgram` to packges. Use `./main-programs.nix`
# instead.
{ pkgs, nodejs }:
let
inherit (pkgs)
stdenv
lib
callPackage
fetchFromGitHub
fetchurl
nixosTests;
since = version: lib.versionAtLeast nodejs.version version;
before = version: lib.versionOlder nodejs.version version;
in
final: prev: {
"@angular/cli" = prev."@angular/cli".override {
prePatch = ''
export NG_CLI_ANALYTICS=false
'';
};
"@electron-forge/cli" = prev."@electron-forge/cli".override {
buildInputs = [ final.node-pre-gyp final.rimraf ];
};
autoprefixer = prev.autoprefixer.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/autoprefixer" \
--prefix NODE_PATH : ${final.postcss}/lib/node_modules
'';
passthru.tests = {
simple-execution = callPackage ./package-tests/autoprefixer.nix { inherit (final) autoprefixer; };
};
};
aws-azure-login = prev.aws-azure-login.override (oldAttrs: {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/aws-azure-login \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium}/bin/chromium
'';
meta = oldAttrs.meta // { platforms = lib.platforms.linux; };
});
bitwarden-cli = prev."@bitwarden/cli".override {
name = "bitwarden-cli";
};
bower2nix = prev.bower2nix.override {
buildInputs = [ pkgs.makeWrapper ];
postInstall = ''
for prog in bower2nix fetch-bower; do
wrapProgram "$out/bin/$prog" --prefix PATH : ${lib.makeBinPath [ pkgs.git pkgs.nix ]}
done
'';
};
carbon-now-cli = prev.carbon-now-cli.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/carbon-now \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
'';
};
coc-imselect = prev.coc-imselect.override (oldAttrs: {
meta = oldAttrs.meta // { broken = since "10"; };
});
dat = prev.dat.override (oldAttrs: {
buildInputs = [ final.node-gyp-build pkgs.libtool pkgs.autoconf pkgs.automake ];
meta = oldAttrs.meta // { broken = since "12"; };
});
deltachat-desktop = prev."deltachat-desktop-../../applications/networking/instant-messengers/deltachat-desktop".override (oldAttrs: {
meta = oldAttrs.meta // { broken = true; }; # use the top-level package instead
});
# NOTE: this is a stub package to fetch npm dependencies for
# ../../applications/video/epgstation
epgstation = prev."epgstation-../../applications/video/epgstation".override (oldAttrs: {
buildInputs = [ final.node-pre-gyp final.node-gyp-build ];
meta = oldAttrs.meta // { platforms = lib.platforms.none; };
});
# NOTE: this is a stub package to fetch npm dependencies for
# ../../applications/video/epgstation/client
epgstation-client = prev."epgstation-client-../../applications/video/epgstation/client".override (oldAttrs: {
meta = oldAttrs.meta // { platforms = lib.platforms.none; };
});
expo-cli = prev."expo-cli".override (oldAttrs: {
# The traveling-fastlane-darwin optional dependency aborts build on Linux.
dependencies = builtins.filter (d: d.packageName != "@expo/traveling-fastlane-${if stdenv.isLinux then "darwin" else "linux"}") oldAttrs.dependencies;
});
fast-cli = prev.fast-cli.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/fast \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
'';
};
flood = prev.flood.override {
buildInputs = [ final.node-pre-gyp ];
};
git-ssb = prev.git-ssb.override (oldAttrs: {
buildInputs = [ final.node-gyp-build ];
meta = oldAttrs.meta // { broken = since "10"; };
});
hsd = prev.hsd.override {
buildInputs = [ final.node-gyp-build pkgs.unbound ];
};
hyperspace-cli = prev."@hyperspace/cli".override {
nativeBuildInputs = with pkgs; [
makeWrapper
libtool
autoconf
automake
];
buildInputs = [ final.node-gyp-build nodejs ];
postInstall = ''
wrapProgram "$out/bin/hyp" --prefix PATH : ${
lib.makeBinPath [ nodejs ]
}
'';
};
ijavascript = prev.ijavascript.override (oldAttrs: {
preRebuild = ''
export NPM_CONFIG_ZMQ_EXTERNAL=true
'';
buildInputs = oldAttrs.buildInputs ++ [ final.node-gyp-build pkgs.zeromq ];
});
insect = prev.insect.override (oldAttrs: {
nativeBuildInputs = oldAttrs.nativeBuildInputs or [] ++ [ pkgs.psc-package final.pulp ];
});
intelephense = prev.intelephense.override (oldAttrs: {
meta = oldAttrs.meta // { license = lib.licenses.unfree; };
});
joplin = prev.joplin.override {
nativeBuildInputs = [ pkgs.pkg-config ];
buildInputs = with pkgs; [
# required by sharp
# https://sharp.pixelplumbing.com/install
vips
libsecret
final.node-gyp-build
final.node-pre-gyp
] ++ lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.AppKit
darwin.apple_sdk.frameworks.Security
];
};
jsonplaceholder = prev.jsonplaceholder.override {
buildInputs = [ nodejs ];
postInstall = ''
exe=$out/bin/jsonplaceholder
mkdir -p $out/bin
cat >$exe <<EOF
#!${pkgs.runtimeShell}
exec -a jsonplaceholder ${nodejs}/bin/node $out/lib/node_modules/jsonplaceholder/index.js
EOF
chmod a+x $exe
'';
};
makam = prev.makam.override {
buildInputs = [ nodejs pkgs.makeWrapper ];
postFixup = ''
wrapProgram "$out/bin/makam" --prefix PATH : ${lib.makeBinPath [ nodejs ]}
${
if stdenv.isLinux
then "patchelf --set-interpreter ${stdenv.glibc}/lib/ld-linux-x86-64.so.2 \"$out/lib/node_modules/makam/makam-bin-linux64\""
else ""
}
'';
};
manta = prev.manta.override {
nativeBuildInputs = with pkgs; [ nodejs-14_x installShellFiles ];
postInstall = ''
# create completions, following upstream procedure https://github.com/joyent/node-manta/blob/v5.2.3/Makefile#L85-L91
completion_cmds=$(find ./bin -type f -printf "%f\n")
node ./lib/create_client.js
for cmd in $completion_cmds; do
installShellCompletion --cmd $cmd --bash <(./bin/$cmd --completion)
done
'';
};
mdctl-cli = prev."@medable/mdctl-cli".override {
nativeBuildInputs = with pkgs; with darwin.apple_sdk.frameworks; [
glib
libsecret
pkg-config
] ++ lib.optionals stdenv.isDarwin [
AppKit
Security
];
buildInputs = [
final.node-gyp-build
final.node-pre-gyp
nodejs
];
};
mermaid-cli = prev."@mermaid-js/mermaid-cli".override (
if stdenv.isDarwin
then {}
else {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/mmdc \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
'';
});
near-cli = prev.near-cli.override {
nativeBuildInputs = with pkgs; [
libusb1
final.prebuild-install
final.node-gyp-build
pkg-config
];
};
node-gyp = prev.node-gyp.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
# Teach node-gyp to use nodejs headers locally rather that download them form https://nodejs.org.
# This is important when build nodejs packages in sandbox.
postInstall = ''
wrapProgram "$out/bin/node-gyp" \
--set npm_config_nodedir ${nodejs}
'';
};
node-inspector = prev.node-inspector.override (oldAttrs: {
buildInputs = [ final.node-pre-gyp ];
meta = oldAttrs.meta // { broken = since "10"; };
});
node-red = prev.node-red.override {
buildInputs = [ final.node-pre-gyp ];
};
node2nix = prev.node2nix.override {
buildInputs = [ pkgs.makeWrapper ];
# We need to use master because of a fix that replaces git:// url to https://.
src = fetchFromGitHub {
owner = "svanderburg";
repo = "node2nix";
rev = "68f5735f9a56737e3fedceb182705985e3ab8799";
sha256 = "sha256-NK6gDTkGx0GG7yPTwgtFC4ttQZPfcLaLp8W8OOMO6bg=";
};
postInstall = ''
wrapProgram "$out/bin/node2nix" --prefix PATH : ${lib.makeBinPath [ pkgs.nix ]}
'';
};
parcel = prev.parcel.override {
buildInputs = [ final.node-gyp-build ];
preRebuild = ''
sed -i -e "s|#!/usr/bin/env node|#! ${nodejs}/bin/node|" node_modules/node-gyp-build/bin.js
'';
};
pnpm = prev.pnpm.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
preRebuild = ''
sed 's/"link:/"file:/g' --in-place package.json
'';
postInstall = let
pnpmLibPath = lib.makeBinPath [
nodejs.passthru.python
nodejs
];
in ''
for prog in $out/bin/*; do
wrapProgram "$prog" --prefix PATH : ${pnpmLibPath}
done
'';
};
postcss-cli = prev.postcss-cli.override (oldAttrs: {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/postcss" \
--prefix NODE_PATH : ${final.postcss}/lib/node_modules \
--prefix NODE_PATH : ${final.autoprefixer}/lib/node_modules
ln -s '${final.postcss}/lib/node_modules/postcss' "$out/lib/node_modules/postcss"
'';
passthru.tests = {
simple-execution = callPackage ./package-tests/postcss-cli.nix {
inherit (final) postcss-cli;
};
};
meta = oldAttrs.meta // { maintainers = with lib.maintainers; [ Luflosi ]; };
});
# To update prisma, please first update prisma-engines to the latest
# version. Then change the correct hash to this package. The PR should hold
# two commits: one for the engines and the other one for the node package.
prisma = prev.prisma.override rec {
nativeBuildInputs = [ pkgs.makeWrapper ];
inherit (pkgs.prisma-engines) version;
src = fetchurl {
url = "https://registry.npmjs.org/prisma/-/prisma-${version}.tgz";
sha512 = "sha512-l9MOgNCn/paDE+i1K2fp9NZ+Du4trzPTJsGkaQHVBufTGqzoYHuNk8JfzXuIn0Gte6/ZjyKj652Jq/Lc1tp2yw==";
};
postInstall = with pkgs; ''
wrapProgram "$out/bin/prisma" \
--set PRISMA_MIGRATION_ENGINE_BINARY ${prisma-engines}/bin/migration-engine \
--set PRISMA_QUERY_ENGINE_BINARY ${prisma-engines}/bin/query-engine \
--set PRISMA_QUERY_ENGINE_LIBRARY ${lib.getLib prisma-engines}/lib/libquery_engine.node \
--set PRISMA_INTROSPECTION_ENGINE_BINARY ${prisma-engines}/bin/introspection-engine \
--set PRISMA_FMT_BINARY ${prisma-engines}/bin/prisma-fmt
'';
passthru.tests = {
simple-execution = pkgs.callPackage ./package-tests/prisma.nix {
inherit (final) prisma;
};
};
};
pulp = prev.pulp.override {
# tries to install purescript
npmFlags = "--ignore-scripts";
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/pulp" --suffix PATH : ${lib.makeBinPath [
pkgs.purescript
]}
'';
};
reveal-md = prev.reveal-md.override (
lib.optionalAttrs (!stdenv.isDarwin) {
nativeBuildInputs = [ pkgs.makeWrapper ];
prePatch = ''
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1
'';
postInstall = ''
wrapProgram $out/bin/reveal-md \
--set PUPPETEER_EXECUTABLE_PATH ${pkgs.chromium.outPath}/bin/chromium
'';
}
);
ssb-server = prev.ssb-server.override (oldAttrs: {
buildInputs = [ pkgs.automake pkgs.autoconf final.node-gyp-build ];
meta = oldAttrs.meta // { broken = since "10"; };
});
stf = prev.stf.override (oldAttrs: {
meta = oldAttrs.meta // { broken = since "10"; };
});
tailwindcss = prev.tailwindcss.override {
plugins = [ ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
nodePath=""
for p in "$out" "${final.postcss}" $plugins; do
nodePath="$nodePath''${nodePath:+:}$p/lib/node_modules"
done
wrapProgram "$out/bin/tailwind" \
--prefix NODE_PATH : "$nodePath"
wrapProgram "$out/bin/tailwindcss" \
--prefix NODE_PATH : "$nodePath"
unset nodePath
'';
passthru.tests = {
simple-execution = callPackage ./package-tests/tailwindcss.nix {
inherit (final) tailwindcss;
};
};
};
teck-programmer = prev.teck-programmer.override {
nativeBuildInputs = [ final.node-gyp-build ];
buildInputs = [ pkgs.libusb1 ];
};
tedicross = prev."tedicross-git+https://github.com/TediCross/TediCross.git#v0.8.7".override {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
makeWrapper '${nodejs}/bin/node' "$out/bin/tedicross" \
--add-flags "$out/lib/node_modules/tedicross/main.js"
'';
};
thelounge = prev.thelounge.override (oldAttrs: {
buildInputs = [ final.node-pre-gyp ];
postInstall = ''
echo /var/lib/thelounge > $out/lib/node_modules/thelounge/.thelounge_home
patch -d $out/lib/node_modules/thelounge -p1 < ${./thelounge-packages-path.patch}
'';
passthru.tests = { inherit (nixosTests) thelounge; };
meta = oldAttrs.meta // { maintainers = with lib.maintainers; [ winter ]; };
});
thelounge-plugin-closepms = prev.thelounge-plugin-closepms.override {
nativeBuildInputs = [ final.node-pre-gyp ];
};
thelounge-theme-flat-blue = prev.thelounge-theme-flat-blue.override {
nativeBuildInputs = [ final.node-pre-gyp ];
};
thelounge-theme-flat-dark = prev.thelounge-theme-flat-dark.override {
nativeBuildInputs = [ final.node-pre-gyp ];
};
triton = prev.triton.override {
nativeBuildInputs = [ pkgs.installShellFiles ];
postInstall = ''
installShellCompletion --cmd triton --bash <($out/bin/triton completion)
'';
};
ts-node = prev.ts-node.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/ts-node" \
--prefix NODE_PATH : ${final.typescript}/lib/node_modules
'';
});
tsun = prev.tsun.override (oldAttrs: {
buildInputs = oldAttrs.buildInputs ++ [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/tsun" \
--prefix NODE_PATH : ${final.typescript}/lib/node_modules
'';
});
typescript-language-server = prev.typescript-language-server.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/typescript-language-server" \
--suffix PATH : ${lib.makeBinPath [ final.typescript ]}
'';
};
uppy-companion = prev."@uppy/companion".override {
name = "uppy-companion";
};
vega-cli = prev.vega-cli.override {
nativeBuildInputs = [ pkgs.pkg-config ];
buildInputs = with pkgs; [
prev.node-pre-gyp
pixman
cairo
pango
libjpeg
];
};
vega-lite = prev.vega-lite.override {
postInstall = ''
cd node_modules
for dep in ${final.vega-cli}/lib/node_modules/vega-cli/node_modules/*; do
if [[ ! -d $dep ]]; then
ln -s "${final.vega-cli}/lib/node_modules/vega-cli/node_modules/$dep"
fi
done
'';
passthru.tests = {
simple-execution = callPackage ./package-tests/vega-lite.nix {
inherit (final) vega-lite;
};
};
};
wavedrom-cli = prev.wavedrom-cli.override {
nativeBuildInputs = [ pkgs.pkg-config final.node-pre-gyp ];
# These dependencies are required by
# https://github.com/Automattic/node-canvas.
buildInputs = with pkgs; [
pixman
cairo
pango
];
};
webtorrent-cli = prev.webtorrent-cli.override {
buildInputs = [ final.node-gyp-build ];
};
yaml-language-server = prev.yaml-language-server.override {
nativeBuildInputs = [ pkgs.makeWrapper ];
postInstall = ''
wrapProgram "$out/bin/yaml-language-server" \
--prefix NODE_PATH : ${final.prettier}/lib/node_modules
'';
};
}