diff --git a/pkgs/development/node-packages/default.nix b/pkgs/development/node-packages/default.nix index 4f9b10574a8..0fcd508012e 100644 --- a/pkgs/development/node-packages/default.nix +++ b/pkgs/development/node-packages/default.nix @@ -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 < $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) diff --git a/pkgs/development/node-packages/main-programs.nix b/pkgs/development/node-packages/main-programs.nix new file mode 100644 index 00000000000..bb9498a4cc9 --- /dev/null +++ b/pkgs/development/node-packages/main-programs.nix @@ -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"; +} diff --git a/pkgs/development/node-packages/overrides.nix b/pkgs/development/node-packages/overrides.nix new file mode 100644 index 00000000000..f4d70e4f9b1 --- /dev/null +++ b/pkgs/development/node-packages/overrides.nix @@ -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 < $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 + ''; + }; +}