From d4d2689fc05595eaaceebb41ad17c95d03b992f2 Mon Sep 17 00:00:00 2001 From: Sizhe Zhao Date: Fri, 10 Oct 2025 20:44:06 +0800 Subject: [PATCH] claude-code-router: init at 1.0.59 --- .../by-name/cl/claude-code-router/package.nix | 115 ++++++++++++++++++ .../cl/claude-code-router/pnpm-lock.patch | 90 ++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 pkgs/by-name/cl/claude-code-router/package.nix create mode 100644 pkgs/by-name/cl/claude-code-router/pnpm-lock.patch diff --git a/pkgs/by-name/cl/claude-code-router/package.nix b/pkgs/by-name/cl/claude-code-router/package.nix new file mode 100644 index 000000000000..435a85ea4cb5 --- /dev/null +++ b/pkgs/by-name/cl/claude-code-router/package.nix @@ -0,0 +1,115 @@ +{ + buildNpmPackage, + esbuild, + fetchFromGitHub, + lib, + makeBinaryWrapper, + nodejs_24, + pnpm_9, + versionCheckHook, +}: +let + buildNpmPackage' = buildNpmPackage.override { nodejs = nodejs_24; }; +in +buildNpmPackage' (finalAttrs: { + pname = "claude-code-router"; + version = "1.0.59"; + + src = fetchFromGitHub { + owner = "musistudio"; + repo = "claude-code-router"; + rev = "4617d66492cf37539d9567044f6ffec7844af2ee"; + hash = "sha256-LC1JIOLaNLYNIIDofgFj+is4mwLjRjD3aAOt/nHRUmo="; + }; + + patches = [ + # pnpm install --fix-lockfile --lockfile-only + ./pnpm-lock.patch + ]; + + postPatch = '' + substituteInPlace src/cli.ts \ + --replace-fail '"node"' '"${lib.getExe nodejs_24}"' + ''; + + npmDeps = null; + pnpmDeps = pnpm_9.fetchDeps { + inherit (finalAttrs) pname src patches; + fetcherVersion = 2; + hash = "sha256-aPAY7JhzzYQero8f0/w3jtf5IwpDnoZCXGQKzRbj9aU="; + }; + + nativeBuildInputs = [ + esbuild + makeBinaryWrapper + pnpm_9.configHook + ]; + + npmConfigHook = pnpm_9.configHook; + + buildPhase = '' + runHook preBuild + + esbuild src/cli.ts --bundle --platform=node --outfile=dist/cli.js + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + mkdir -p $out/lib/claude-code-router/dist + cp dist/cli.js $out/lib/claude-code-router/dist/ + cp node_modules/tiktoken/tiktoken_bg.wasm $out/lib/claude-code-router/dist/ + cp ${finalAttrs.passthru.ui}/index.html $out/lib/claude-code-router/dist/ + + mkdir -p $out/bin + makeBinaryWrapper ${lib.getExe nodejs_24} $out/bin/ccr \ + --add-flags "$out/lib/claude-code-router/dist/cli.js" + + runHook postInstall + ''; + + doInstallCheck = true; + nativeInstallCheckInputs = [ versionCheckHook ]; + versionCheckProgramArg = "-v"; + + passthru.ui = buildNpmPackage' (finalAttrs': { + pname = finalAttrs.pname + "-ui"; + inherit (finalAttrs) version src; + + sourceRoot = "${finalAttrs'.src.name}/ui"; + + npmDeps = null; + pnpmDeps = pnpm_9.fetchDeps { + inherit (finalAttrs') pname src sourceRoot; + fetcherVersion = 2; + hash = "sha256-ZjYLUec9EADQmKfju8hMbq0y4f1TDVwjbe3yw8Gh4Ac="; + }; + + nativeBuildInputs = [ + pnpm_9.configHook + ]; + + npmConfigHook = pnpm_9.configHook; + + installPhase = '' + runHook preInstall + + mkdir -p $out + cp dist/index.html $out/ + + runHook postInstall + ''; + }); + + meta = { + description = "Tool to route Claude Code requests to different models and customize any request"; + homepage = "https://github.com/musistudio/claude-code-router"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ + prince213 + ]; + mainProgram = "ccr"; + }; +}) diff --git a/pkgs/by-name/cl/claude-code-router/pnpm-lock.patch b/pkgs/by-name/cl/claude-code-router/pnpm-lock.patch new file mode 100644 index 000000000000..b060b630d425 --- /dev/null +++ b/pkgs/by-name/cl/claude-code-router/pnpm-lock.patch @@ -0,0 +1,90 @@ +--- a/pnpm-lock.yaml ++++ b/pnpm-lock.yaml +@@ -356,6 +356,12 @@ + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + ++ '@types/mute-stream@0.0.4': ++ resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} ++ ++ '@types/node@22.18.9': ++ resolution: {integrity: sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg==} ++ + '@types/node@24.7.0': + resolution: {integrity: sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==} + +@@ -904,6 +910,9 @@ + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + ++ safer-buffer@2.1.2: ++ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} ++ + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + +@@ -1026,11 +1035,18 @@ + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + ++ type-fest@0.21.3: ++ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} ++ engines: {node: '>=10'} ++ + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + ++ undici-types@6.21.0: ++ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} ++ + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} + +@@ -1253,7 +1269,7 @@ + '@inquirer/figures': 1.0.13 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 +- '@types/node': 22.18.8 ++ '@types/node': 22.18.9 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 +@@ -1386,6 +1402,14 @@ + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + ++ '@types/mute-stream@0.0.4': ++ dependencies: ++ '@types/node': 24.7.0 ++ ++ '@types/node@22.18.9': ++ dependencies: ++ undici-types: 6.21.0 ++ + '@types/node@24.7.0': + dependencies: + undici-types: 7.14.0 +@@ -1956,6 +1980,8 @@ + + safe-stable-stringify@2.5.0: {} + ++ safer-buffer@2.1.2: {} ++ + secure-json-parse@4.1.0: {} + + semver@5.7.2: {} +@@ -2054,8 +2080,12 @@ + + tr46@0.0.3: {} + ++ type-fest@0.21.3: {} ++ + typescript@5.9.3: {} + ++ undici-types@6.21.0: {} ++ + undici-types@7.14.0: {} + + undici@7.16.0: {}