{ lib, buildNpmPackage, fetchFromGitHub, fetchurl, nodejs_22, makeBinaryWrapper, }: let version = "3.8.52"; npmTarball = fetchurl { url = "https://registry.npmjs.org/omniroute/-/omniroute-${version}.tgz"; hash = "sha256-T7Vw99swmfwcwB0W9ON8DBoctDBJ/z6F+/v6hsZrhqc="; }; in buildNpmPackage (finalAttrs: { pname = "omniroute"; inherit version; src = fetchFromGitHub { owner = "diegosouzapw"; repo = "OmniRoute"; rev = "v${finalAttrs.version}"; hash = "sha256-k4+iy6aFWaFxVPcTStR4xNCJjw/UHeMqb5XnEvuqJZU="; }; nodejs = nodejs_22; # Upstream's package-lock omits `resolved` URLs for some entries, which the # v1 fetcher drops from the cache (npm then fails with ENOTCACHED). npmDepsFetcherVersion = 2; npmDepsHash = "sha256-F4q2JTPy1L33U6Hlh99Ehd2Cjwo9CET46JlKb2sGSWE="; # Skip Next.js build (requires network for Google Fonts). # Pre-built dist/ is copied from the npm tarball in preConfigure. dontNpmBuild = true; nativeBuildInputs = [ makeBinaryWrapper ]; npmInstallFlags = [ "--ignore-scripts" ]; npmRebuildFlags = [ "--ignore-scripts" ]; env = { HOME = "$TMPDIR"; }; preConfigure = '' mkdir -p _npm_tmp tar xzf ${npmTarball} -C _npm_tmp cp -r _npm_tmp/package/dist . rm -rf _npm_tmp ''; installPhase = '' runHook preInstall mkdir -p $out/lib/node_modules/omniroute cp -r . $out/lib/node_modules/omniroute/ mkdir -p $out/bin makeWrapper "${nodejs_22}/bin/node" "$out/bin/omniroute" \ --add-flags "$out/lib/node_modules/omniroute/bin/omniroute.mjs" makeWrapper "${nodejs_22}/bin/node" "$out/bin/omniroute-reset-password" \ --add-flags "$out/lib/node_modules/omniroute/bin/reset-password.mjs" runHook postInstall ''; passthru = { category = "AI LLM Gateway"; updateScript = [ "nix-update" "--flake" ".#omniroute" ]; }; meta = { description = "Unified AI router with 160+ providers, RTK+Caveman compression, auto fallback, MCP/A2A, OpenAI-compatible APIs"; homepage = "https://github.com/diegosouzapw/OmniRoute"; changelog = "https://github.com/diegosouzapw/OmniRoute/releases/tag/v${finalAttrs.version}"; license = lib.licenses.mit; mainProgram = "omniroute"; platforms = lib.platforms.all; }; })