{ lib, buildNpmPackage, fetchFromGitHub, fetchurl, nodejs_22, makeBinaryWrapper, }: let version = "3.8.50"; npmTarball = fetchurl { url = "https://registry.npmjs.org/omniroute/-/omniroute-${version}.tgz"; hash = "sha256-c4xYrx+q6MV+tkOpOdEZH41+CD2Sle9haH0r/wSHjCk="; }; in buildNpmPackage (finalAttrs: { pname = "omniroute"; inherit version; src = fetchFromGitHub { owner = "diegosouzapw"; repo = "OmniRoute"; rev = "v${finalAttrs.version}"; hash = "sha256-+2FMc9wrvPtQS3+mGsBVvKrd5RprYe/r/GJvjAVMBpc="; }; 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-wa5vQMYugA8E7lXOh4lgNH7JNbKOinNaW6Zk8Mw2e8k="; # 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; }; })